Route Constraint Isnt适用于ASP.NET MVC

Mik*_*ynn 5 asp.net-mvc

为什么这条路线http://localhost:2222/2012-adidas-spring-classic/37不能从下面的路线中获取?我收到404错误.

      public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
            routes.IgnoreRoute("{*vti_inf}", new { vti_inf = @"(.*/)?_vti_inf.html(/.*)?" });
            routes.IgnoreRoute("{*vti_rpc}", new { vti_rpc = @"(.*/)?_vti_rpc(/.*)?" });

            #region API

            routes.MapRouteLowercase(
             "NamedHomeEvent",
             "{year}-{name}/{Id}",
             new { controller = "Event", action = "Index", year = DateTime.Now.Year },
             new { year = @"\d{4}", Id = @"\d+" }
            );



   public virtual ActionResult Index(int? id, int? year, string name)
        {
Run Code Online (Sandbox Code Playgroud)

Dar*_*rov 4

路由引擎在这里无法帮助您。您可以编写自定义路由来处理这种情况:

public class MyRoute : Route
{
    public MyRoute()
        : base(
            "{year-name}/{id}",
            new RouteValueDictionary(new { controller = "Event", action = "Index", id = UrlParameter.Optional }),
            new RouteValueDictionary(new { id = @"\d*" }),
            new MvcRouteHandler()
        )
    {
    }

    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        var routeData = base.GetRouteData(httpContext);
        if (routeData == null)
        {
            return null;
        }

        var yearName = (string)routeData.Values["year-name"];
        if (string.IsNullOrWhiteSpace(yearName))
        {
            return null;
        }

        var parts = yearName.Split(new[] { '-' }, 2, StringSplitOptions.RemoveEmptyEntries);
        if (parts.Length < 2)
        {
            return null;
        }

        var year = parts.First();
        int yearValue;
        if (!int.TryParse(year, out yearValue))
        {
            return null;
        }

        var name = parts.Last();

        routeData.Values.Add("year", year);
        routeData.Values.Add("name", name);

        return routeData;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后注册这个路由:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    routes.IgnoreRoute("{*vti_inf}", new { vti_inf = @"(.*/)?_vti_inf.html(/.*)?" });
    routes.IgnoreRoute("{*vti_rpc}", new { vti_rpc = @"(.*/)?_vti_rpc(/.*)?" });

    routes.Add("NamedHomeEvent", new MyRoute());
}
Run Code Online (Sandbox Code Playgroud)