就在我认为我已找到路由时,它不会像我认为的那样工作。我正在使用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 声明为可选参数。参数名称:参数
我做错了什么?我首先列出了更具体的路线。请帮忙。
答案 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+" }
);