19

新しい ASP.NET MVC プロジェクトを作成し、サイト承認フィルターを実装しました。

ルートをペアにマップするとき{controller}/{action}、role = "SomeRole" default をルートに渡します。

完全な URL ( ) を通過し、完全http://localhost/somecontroller/someactionなルートを指定すると、完全に機能します。

MapRoute("SomeAction", "somecontroller/someaction",
 new { controller = "SomeController", action = "SomeAction", role = "SomeRole");

問題は、誰かが訪問したときに、代わりにhttp://thesiteaddress.com呼び出すデフォルトルートが必要であり、指定した場合/home/index/

MapRoute("Default", new { controller="somecontroller",action="action" });

role="SomeRole"その後、前の を失いMapRouteます。

どうすればこれを解決できますか?

4

4 に答える 4

35

Defaultルートがリストされたルート テーブルのBOTTOMにあることを確認します。ASP.NET MVC ルーティング テーブルに関しては、順序が重要です。

正しい順序は、「最も具体的な」ルートから最も具体的でないルートです。

于 2009-06-10T00:47:33.533 に答える
18

実際、ジョージは正しい。MVC ルーティングは順序付けルートを尊重します。最後のルートはできるだけ一般的なものにする必要があり、前のルートはできるだけ具体的なものにする必要があります。

あなたの場合、どちらも一般的です。あなたがすべき

MapRoute("SomeAction", "Post/{action}", new {controller = "Post", role = "User");

その後

MapRoute("Default", new {controller="Home", action="Index", role = "Anonymous"});

したがって、両方のルートに特異性を与えます。

于 2009-06-24T03:18:16.527 に答える
13

Phil Haackは、このような問題を理解する上で非常に貴重なルートデバッグツールをリリースしました。

このツールを使用すると、MVCアプリケーションがURLを解析し、それをRouteTableと照合する方法を確認できます。

于 2009-06-10T12:18:32.047 に答える
2

ルート名を指定しない場合、またはアクションが HTTP リクエストによって決定される場合、追加された順序から順番に検索されます。一致するものが初めて見つかった時点で停止します。したがって、おそらく起こっているのは、追加したものよりも前のものと一致していることです。

于 2009-06-10T01:08:49.997 に答える