我目前有以下路线:
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.IgnoreRoute("{resource}.gif/{*pathInfo}");
MvcRoute.MappUrl("{controller}/{action}/{ID}")
.WithDefaults(new { controller = "home", action = "index", ID = 0 })
.WithConstraints(new { controller = "..." })
.AddWithName("default", routes)
.RouteHandler = new MvcRouteHandler();
MvcRoute.MappUrl("{title}/{ID}")
.WithDefaults(new { controller = "special", action = "Index" })
.AddWithName("view", routes)
.RouteHandler = new MvcRouteHandler();
SpecialController有一个方法:public ActionResult Index(int ID)
每当我将浏览器指向http://hostname/test/5
时,我都会收到以下错误:
参数字典在'SpecialController'中包含方法'System.Web.Mvc.ActionResult Index(Int32)'的非可空类型'System.Int32'的参数'ID'的空条目。要使参数可选,其类型应为引用类型或Nullable类型。
参数名称:参数
描述:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪,以获取有关错误及其在代码中的起源位置的更多信息。
为什么?我使用了mvccontrib路由调试器,似乎可以按预期访问路由。
答案 0 :(得分:4)
我认为您应该将自定义路线放在之前。
http://weblogs.asp.net/scottgu/archive/2007/12/03/asp-net-mvc-framework-part-2-url-routing.aspx
答案 1 :(得分:3)
我建议解决方案是您的路径变量名称与您的操作参数名称不匹配。
// Global.asax.cs
MvcRoute.MappUrl("{controller}/{action}/{ID}")
.WithDefaults(new { controller = "home", action = "index", ID = 0 })
.WithConstraints(new { controller = "..." })
.AddWithName("default", routes)
.RouteHandler = new MvcRouteHandler();
这样可行:
// Controller.cs
public ActionResult Index(int ID){...}
这不会:
// Controller.cs
public ActionResult Index(int otherID) {...}
答案 2 :(得分:2)
正如错误消息所说的那样。你有一个名为“ID”的参数没有默认值,但你的方法期望一个不可为空的int。因为没有默认值,所以它试图传入“null”,但是......它不能,因为你的int参数是不可为空的。
路由调试器可能不检查可为空的类型。
修复它:
MvcRoute.MappUrl("{title}/{ID}")
.WithDefaults(new { controller = "special", action = "Index", ID = 0 })
.AddWithName("view", routes)
.RouteHandler = new MvcRouteHandler();