Route Constraint Isnt适用于ASP.NET MVC

时间:2012-12-21 07:24:59

标签: 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)
        {

1 个答案:

答案 0 :(得分: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;
    }
}

然后注册这条路线:

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