映射自定义路由ASP.NET MVC5

时间:2015-03-03 05:07:13

标签: c# asp.net-mvc asp.net-mvc-5 url-routing asp.net-mvc-routing

之前我没有使用过.NET Routing。 我有一个网址: http://myurl.com/Account/Login/?IsIPA=true 。 我希望能够使用以下内容点击此网址: http://myurl.com/IPA

这是我想要的唯一自定义路线。

我可以为这样的网址创建路由吗?

我的代码无效:

    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" });

    }

我收到错误:

  

路由模板IsIPA的路由上的约束条目Account/Login/{IsIPA}=True必须具有字符串值或者是实现System.Web.Routing.IRouteConstraint的类型。

2 个答案:

答案 0 :(得分:7)

路由匹配类似于switch case语句。 url参数以及任何默认值和约束都被认为是确定它是否与传入的URL匹配。如果路由匹配,则它将根据配置创建路由值字典。如果路线不匹配,则尝试集合中的下一个路线,直到找到(或不匹配)匹配。

这意味着指定路线的顺序很重要。默认路由将任何 URL与0,1,2或3段匹配。因此,在大多数情况下,您需要在默认路由之前定义自定义路由

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的Controller和名为Login的Action方法,并传递其他路由密钥IsIPA。将为Controller / Action / IsIPA组合构建相同的URL,因为它是列表中匹配的第一个。

请注意,原始网址http://myurl.com/Account/Login/?IsIPA=true仍然可以使用,但仍会路由到同一位置。此配置只是为该资源添加了一条额外的路由。

答案 1 :(得分:0)

没有测试,我认为你想要这个:

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