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