web-dev-qa-db-ja.com

ASP.NET MVCデフォルトルート?

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

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

完全な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" });

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

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

17
Edoardo

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

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

34
George Stocker

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

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

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

その後

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

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

17
Jirapong

Phil Haack リリース済み このような問題を理解する上で非常に役立つルートデバッグツール。

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

12
Ray Vernagus

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

2
Chad Moran