映射自定义路由 ASP.NET MVC5

Map Custom Route ASP.NET MVC5

我以前没有使用过 .NET 路由。 我有一个URL: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" });
}

我收到错误:

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.

未经测试,我认为您想要这个:

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

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

这意味着指定路由的顺序很重要。默认路由匹配 any 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。同样的 URL 将为 Controller/Action/IsIPA 组合构建,因为它是列表中第一个匹配的组合。

请注意,原来的 URL http://myurl.com/Account/Login/?IsIPA=true 仍然有效,并且仍然路由到相同的位置。此配置只是为该资源添加了一条额外的路由。