カスタムIroutehandlerルートは、MVCリンクビルディングをねじ込みます
-
08-10-2019 - |
質問
ASP.NET MVC2にカスタムルートハンドラーがあり、このような接頭辞パスですべてのURLをキャッチします。
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.Add(new Route("@api/{*all}", new ApiHandler()));
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
ルーティングは正常に動作しますが、html.actionlinkまたはreturntoaction()をコントローラーから使用する場合、URIビルドは次のように壊れたURIを作成します。
/@api?action=Add&controller=Home
それ以外の
/Home/Add
デフォルトのルートパターンを検討するために、URIビルディングロジックに影響を与えるにはどうすればよいですか?
解決
説明された動作を停止するためのハックを思いつきました。これは問題を「解決」しますが、それは本当に厄介なものであり、仮想パスビルディングロジックからルートを除外するよりクリーンな方法を好む
routes.Add(
new Route("@api/{*all}",
// A random and unlikely controller name as the default
new RouteValueDictionary() { { "controller", "qwewqewqeqweq" } },
// and a constraint requiring any controller to be that random, default value
new RouteValueDictionary() { { "controller", "qwewqewqeqweq" } },
new ApiHandler()
);
これは、問題のコントローラーが「Qwewqewqeqweq」である場合にのみ、ルートが仮想パス構築に選択されることを意味します。私はそれが厄介だと言った。
他のヒント
を使用してルートの名前を指定できます RouteLink
ヘルパー:
<%: Html.RouteLink("link text", "Default",
new { action = "add", controller = "home" }) %>
所属していません StackOverflow