ASP.NET MVCルートのクエリ文字列がなぜですか?
-
03-07-2019 - |
質問
私が開発しているASP.NET MVC(ベータ)サイトでは、ActionLinkの呼び出しがクエリ文字列を含むURLを返すことがあります。この動作を引き起こす状況を分離しましたが、なぜクリーンなURLを生成する代わりに、クエリ文字列パラメーターを使用することに決めたのか、まだわかりません。機能的には同じであることがわかりますが、URLの一貫性(および外観)のために、これは私が望むものではありません。
ここに私のルートがあります:
routes.MapRoute(
"Photo Gallery Shortcut",
"group/{groupname}",
new { controller = "Photos", action = "All", Id = "" });
routes.MapRoute(
"Tagged Photos", //since the Tagged action takes an extra parameter, put it first
"group/{groupname}/Photos/Tagged/{tagname}/{sortby}",
new { controller = "Photos", action = "Tagged", Id = "", SortBy = "" });
routes.MapRoute(
"Photo Gallery", //since the Gallery's defualt action is "All" not "Index" its listed seperatly
"group/{groupname}/Photos/{action}/{sortby}",
new { controller = "Photos", action = "All", Id = "", SortBy = "" });
routes.MapRoute(
"Group", //<-- "Group" Category defined above
"group/{groupname}/{controller}/{action}/{id}",
new {controller = "Photos", action = "Index", Id = ""});
「Tagged Photos」という名前のルートで記述されたビューを表示しているときにのみ問題が発生します。次を介してActionLinkを実行します。
Html.ActionLink<PhotosController>(p => p.All((string)ViewData["group"], ""), "Home")
URLを生成する:
http://domain/group/GROUPNAME?sortBy=
他のビューから生成されるURLは次のとおりです。
http://domain/group/GROUPNAME
Philの ASP.NETルーティングデバッガー、すべてが順番に表示されます。これには困惑しています。アイデアはありますか?
解決
異なるビューが異なるURLを生成する理由がわからない。
ただし、デフォルト値を最初のルートに割り当てることで、sortByパラメーターを削除できます。
new {sortBy =&quot;&quot; }
生成時に、sortByがデフォルトに一致する場合、ルートエンジンはそのパラメーターをスキップします(クエリ文字列にある場合)。
他のヒント
ASP.NETでのルーティングの動作方法のため、アクションルートではなく名前付きルートをここで使用する必要があります。これは、「ベストマッチ」ではなく「ファーストマッチ」を行うためです。
最初のルートをピックアップしていると思います。また、すべてのアクションがあります。また、sortbyは指定されていないため、クエリ文字列パラメーターとして公開されています
これは、sortbyパラメータにクエリ文字列値を入力するだけなので、PhotosControllerのアクションメソッド「All」で引き続き機能します。
ルートデバッガーでは、3番目のルートを実行していますか、それとも1番目のルートを実行していますか?