映射自定义路由ASP.NET MVC5

Rhy*_*ens 4 c# asp.net-mvc url-routing asp.net-mvc-routing asp.net-mvc-5

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

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

我可以为这样的单个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" });

    }
Run Code Online (Sandbox Code Playgroud)

我收到错误:

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

Nig*_*888 9

路由匹配类似于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 }
    );
}
Run Code Online (Sandbox Code Playgroud)

上面的配置将路由http://myurl.com/IPA到名为Controller且名为AccountAction的方法Login,并传递其他路由密钥IsIPA.将为Controller/Action/IsIPA组合构建相同的URL,因为它是列表中匹配的第一个URL.

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