新しい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"
を失います。
どうすればこれを解決できますか?
Default
ルートが、リストされたルートテーブルの[〜#〜] bottom [〜#〜]にあることを確認してください。 ASP.NET MVCルーティングテーブルに関しては、順序が重要です。
正しい順序は、「最も具体的な」ルートから最も具体的でないルートへの順です。
実際、 ジョージは正しい 。 MVCルーティングは順序付けルートを尊重します。最後のルートはできるだけ一般的である必要があり、以前のルートは可能な限り具体的である必要があります。
あなたの場合、どちらも一般的です。あなたがすべき
MapRoute("SomeAction", "Post/{action}", new {controller = "Post", role = "User");
その後
MapRoute("Default", new {controller="Home", action="Index", role = "Anonymous"});
したがって、両方のルートに特定性を与えます。
Phil Haack リリース済み このような問題を理解する上で非常に役立つルートデバッグツール。
このツールを使用すると、MVCアプリケーションがURLを解析してRouteTableと照合する方法を表示できます。
ルート名を指定しない場合、またはアクションがHTTPリクエストによって決定される場合は、追加された順序から順番に検索されます。最初に一致するものが見つかると、停止します。したがって、おそらく何が起こっているのかは、追加したものの前のものと一致しています。