代码之家  ›  专栏  ›  技术社区  ›  Yannis

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

  •  2
  • Yannis  · 技术社区  · 17 年前

    我目前有以下路线:

    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 ,我得到以下错误:


    参数名称:参数
    描述:执行当前web请求期间发生未处理的异常。请查看堆栈跟踪以了解有关错误的更多信息以及错误在代码中的起源。

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

    3 回复  |  直到 9 年前
        1
  •  4
  •   CD..    17 年前
        2
  •  3
  •   Mr.Wizard naktepe    15 年前

    我建议解决方案是路由变量名称与操作参数名称不匹配。

    // 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) {...}
    
        3
  •  2
  •   womp    17 年前

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

    路由调试器可能不会检查类型是否为nullable。

    要解决此问题,请执行以下操作:

     MvcRoute.MappUrl("{title}/{ID}")
            .WithDefaults(new { controller = "special", action = "Index", ID = 0 })
            .AddWithName("view", routes)
            .RouteHandler = new MvcRouteHandler();
    
    推荐文章