1

我以前沒有使用.NET路由。 我有一個網址:http://myurl.com/Account/Login/?IsIPA=true。 我希望能打到這個網址有以下幾點:http://myurl.com/IPA地圖自定義路由ASP.NET MVC5

這是我想打的唯一定製的路線。

我可以爲此類單個URL創建路由嗎?

我的代碼不工作是:

public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
     routes.MapMvcAttributeRoutes(); 

     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 
     routes.MapRoute("IPA", "Account/Login/{IsIPA}", new { controller = "Account", action = "Login", IsIPA = "true" }); 

    } 

我得到的錯誤:

The constraint entry IsIPA on the route with route template Account/Login/{IsIPA}=True must have a string value or be of a type which implements System.Web.Routing.IRouteConstraint .

+0

嘗試... routes.MapRoute(「IPA」,「Account/Login/{IsIPA}」,new {controller =「Account」,action =「Login」,IsIPA =「true」}); – 2015-03-03 05:10:17

+0

哦,我明白你想要什麼。等一下。 – 2015-03-03 05:11:12

回答

5

路由匹配類似於switch case語句。 url參數以及任何默認值和約束都將被視爲確定它是否與傳入的URL匹配。如果路線匹配,則會根據配置創建路線值的字典。如果路線不匹配,則會嘗試收集下一條路線,直到找到匹配(或不匹配)。

這意味着路線指定的順序非常重要。默認路由匹配任意具有0,1,2或3段的URL。因此,在大多數情況下,您需要在之前定義您的自定義路線默認路線。

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
    routes.MapMvcAttributeRoutes(); 

    routes.MapRoute(
     name: "IPA", 
     url: "IPA", 
     defaults: new { controller = "Account", action = "Login", IsIPA = "true" }); 

    routes.MapRoute(
     name: "Default", 
     url: "{controller}/{action}/{id}", 
     defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
    ); 
} 

上述配置將路由http://myurl.com/IPA到名爲Account控制器和動作方法命名Login,並通過附加路由密鑰IsIPA。此控制器/操作/ IsIPA組合將構建相同的URL,因爲它是第一個與列表中匹配的URL。

請注意,原始URL http://myurl.com/Account/Login/?IsIPA=true仍然可以工作,並仍然路由到相同的位置。該配置只是爲該資源添加額外路線。

+0

這工作。感謝您的解答! – 2015-03-04 22:27:55

+0

使用RedirectToAction(「Login」,「Account」)和Url.Action(「Login」,「Account」)都會重定向到〜/ IPA,即使布爾型IsIPA爲false時也存在問題。通過調用IsIPA來解決這個問題是錯誤的: 'RedirectToAction(「Login」,「Account」,new {IsIPA = false})或Url.Action(「Login」,「Account」,new {IsIPA = false})' 有沒有辦法讓它不默認路由IsIPA = true? – 2015-03-15 22:53:29

+0

如果您將路由中的默認值設置爲「false」而不是「true」,則默認值爲「false」。但是,如果您需要覆蓋默認值,則需要使用不同條件下匹配的不同路由(使用不同的默認值),或者需要明確提供「IsIPA」路由值。您可以創建一個自定義HTML助手擴展來提供'IsIPA'值,但是如果您使用單一路由,則必須提供它,如果您希望它與默認值不同。 – NightOwl888 2015-03-16 05:02:42

0

沒有測試它,我想你想的:

routes.MapRoute("IPA", "Account/Login/{IsIPA}", 
       new { controller = "Account", action = "Login", IsIPA = "true"}); 
+0

我得到了:404錯誤:無法找到資源。 – 2015-03-03 06:11:48