ASP.NET MVC路由 - 尝试在URL中使用名称

时间:2009-07-25 18:59:04

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

我目前有以下路线:

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路由调试器,似乎可以按预期访问路由。

3 个答案:

答案 0 :(得分:4)

答案 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();