5

なぜこれが機能しないのですか?

ルート:

routes.MapRoute(
                "Summary",
                "{controller}/{id}",
                new { controller = "Summary", action = "Default" }
            );

コントローラ:

public class SummaryController : Controller
    {
        public ActionResult Default(int id)
        {
            Summary summary = GetSummaryById(id);

            return View("Summary", summary);
        }
    }

URL:

http://localhost:40353/Summary/107

エラー:

Server Error in '/' Application.

    The resource cannot be found.

    Description: HTTP 404. The resource you are looking for (or one of its dependencies) could have been removed, had its name changed, or is temporarily unavailable.  Please review the following URL and make sure that it is spelled correctly. 

    Requested URL: /Summary/107

    Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.225

アップデート:

よりインテリジェントな質問で質問を更新させてください。どうすればこれらの両方を持つことができますか?

routes.MapRoute(
                    "Home",
                    "{controller}",
                    new { controller = "Home", action = "Default" }
                );

routes.MapRoute(
                    "Summary",
                    "{controller}/{id}",
                    new { controller = "Summary", action = "Default" }
                );
4

2 に答える 2

11

ルートはどのように機能しますか (デフォルトで)?

次のようなデフォルト ルートに戻りましょう。

routes.MapRoute(

    // Route name
    "Default", 

    // URL with parameters
    "{controller}/{action}/{id}", 

    // Parameter defaults
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } 

);

これがどのように機能するかを理解してみましょう。

  • にアクセスすると、コントローラーのアクション/が呼び出されます。オプションの Id が省略されました。IndexHome

  • アクセスすると、コントローラーのアクション/Cが呼び出されます。オプションの Id が省略されました。IndexC

  • アクセスすると、コントローラーのアクション/C/Aが呼び出されます。オプションの Id が省略されました。AC

  • アクセスすると idのコントローラーのアクションを/C/A/1呼び出します。AC1

そのため、そのルートは/、 、/C/C/Aおよびの形式の URL を許可します。/C/A/1ここCで、 はコントローラーでありA、 はアクションです。これは何を意味するのでしょうか?これは、必ずしも独自のルートを指定する必要がないことを意味します。

したがって、ルートがなければ、HomeControllerと を持ち、SummaryControllerという最後のコントローラーにアクションを追加することができますShow

それから/Summary/Show/1電話しますSummaryController.Show(1)


コントローラーのルート (/Controller/Id) を短くしたい場合はどうすればよいですか?

/Summary/1を呼び出すようなルートをマッピングしたいとしましょうSummaryController.Show(1)

正しい形式は次のとおりです。

routes.MapRoute(
    "Summary",
    "Summary/{id}",
    new { controller = "Summary", action = "Show" }
);

routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

Homeルートをルートのように変更したことに注意してくださいDefault。これで、フォームの URL がそのルートをトリガーすることSummaryを伝えるルートを追加しました。それらが実行されると、コントローラーのアクションがSummary/{id}呼び出され、パラメーターとして渡されます。それはまさにあなたが望むものです...ShowSummaryid

Summaryまた、優先されるようにルートを最初に配置する必要があることにも注意してください。

注意:作成するアクションごとに新しいルートを作成する必要はありません。また、すべてのアクションを同じコントローラーに入れたくありません。これらのいずれかに当てはまる場合は、後で問題が発生しないように、アプローチを再考することを検討してください...

于 2012-05-03T17:54:42.487 に答える
0

置き換えてみてください:

new { controller = "Summary", action = "Default" }

と :

new { controller = "Summary", action = "Default", id = UrlParameter.Optional }

編集:あなたのコードを試してみてください。global.asax で定義されている他のルートはありますか?

于 2012-05-03T17:14:25.973 に答える