使用RouteConstraint的ASP.Net MVC路由不起作用

时间:2012-08-08 16:04:32

标签: asp.net-mvc asp.net-mvc-routing

就在我认为我已找到路由时,它不会像我认为的那样工作。我正在使用ASP.Net MVC 4 RC。这是我的RouteConfig:

        routes.MapRoute
        (
            "TwoIntegers",
            "{controller}/{action}/{id1}/{id2}",
            new { controller = "Gallery", action = "Index", id1 = new Int32Constraint(), id2 = new Int32Constraint() }
        );

        routes.MapRoute
        (
            "Default",
            "{controller}/{action}/{id}",
            new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

这是我的路线限制:

public class Int32Constraint : IRouteConstraint
{
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        if (values.ContainsKey(parameterName))
        {
            int intValue;
            return int.TryParse(values[parameterName].ToString(), out intValue) && (intValue != int.MinValue) && (intValue != int.MaxValue);
        }

        return false;
    }
}

/ {domain.com} / PageSection /编辑/ 21

它正在“TwoIntegers”路线停下来。很明显,没有传递第二个整数。

这是我的错误:

  

参数字典包含参数'id'的空条目   方法的非可空类型'System.Int32'   'System.Web.Mvc.ActionResult编辑(Int32)'中   'SolutiaConsulting.Web.ContentManager.Controllers.PageSectionController'。   可选参数必须是引用类型,可空类型或be   声明为可选参数。参数名称:参数

我做错了什么?我首先列出了更具体的路线。请帮忙。

1 个答案:

答案 0 :(得分:2)

未正确指定约束。确保使用MapRoute扩展方法的正确重载:

routes.MapRoute(
    "TwoIntegers",
    "{controller}/{action}/{id1}/{id2}",
    new { controller = "Gallery", action = "Index" },
    new { id1 = new Int32Constraint(), id2 = new Int32Constraint() }
);

注意用于指定约束的第4个参数,而不是第3个。

不过,您可以使用命名参数使代码更具可读性:

routes.MapRoute(
    name: "TwoIntegers",
    url: "{controller}/{action}/{id1}/{id2}",
    defaults: new { controller = "Gallery", action = "Index" },
    constraints: new { id1 = new Int32Constraint(), id2 = new Int32Constraint() }
);

正则表达式怎么样?

routes.MapRoute(
    name: "TwoIntegers",
    url: "{controller}/{action}/{id1}/{id2}",
    defaults: new { controller = "Gallery", action = "Index" },
    constraints: new { id1 = @"\d+", id2 = @"\d+" }
);