2

我目前有以下路线:

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 类型。
参数名称:parameters
描述:当前web请求执行过程中发生了未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

这是为什么?我使用了 mvccontrib 路由调试器,似乎可以按预期访问该路由。

4

3 回答 3

4

我认为您应该将自定义路由放在默认路由之前。

http://weblogs.asp.net/scottgu/archive/2007/12/03/asp-net-mvc-framework-part-2-url-routing.aspx

于 2009-07-25T19:36:47.060 回答
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) {...}
于 2010-01-07T20:22:26.143 回答
2

就像错误消息所说的那样。您有一个名为“ID”的参数,它没有默认值,但您的方法需要一个不可为空的 int。因为没有默认值,它试图传入一个“null”,但是......它不能,因为你的 int 参数是不可为空的。

路由调试器可能不会检查可空类型。

要解决这个问题:

 MvcRoute.MappUrl("{title}/{ID}")
        .WithDefaults(new { controller = "special", action = "Index", ID = 0 })
        .AddWithName("view", routes)
        .RouteHandler = new MvcRouteHandler();
于 2009-07-25T19:06:31.270 回答