0

就在我认为我已经弄清楚了路由时,它并没有按照我认为的方式工作。我正在使用 ASP.Net MVC 4 RC。这是我的路由配置:

        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/Edit/21

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

这是我的错误:

参数字典包含“SolutiaConsulting.Web.ContentManager.Controllers.PageSectionController”中方法“System.Web.Mvc.ActionResult Edit(Int32)”的不可空类型“System.Int32”的参数“id”的空条目。可选参数必须是引用类型、可空类型或声明为可选参数。参数名称:参数

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

4

1 回答 1

2

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

routes.MapRoute(
    "TwoIntegers",
    "{controller}/{action}/{id1}/{id2}",
    new { controller = "Gallery", action = "Index" },
    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 = 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+" }
);
于 2012-08-08T16:23:37.303 回答