ASP.NET MVC路由 - 试图在URL中有一个名字(ASP.NET MVC routing -

2019-09-20 20:43发布

我目前有以下途径:

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.Int32”的方法“System.Web.Mvc.ActionResult指数(的Int32)”的参数“ID”空条目。 为了使一个参数可选它的类型应该是引用类型或可空类型。
参数名:参数
说明:在当前Web请求的执行过程中发生未处理的异常。 请检查堆栈跟踪有关该错误它起源于代码的详细信息和。

这是为什么? 我用mvccontrib路线调试器,似乎路线是可访问的预期。

Answer 1:

这正是作为错误信息说。 你已经有了一个被称为“ID”,它没有缺省值的参数,但你的方法需要一个非空的INT。 因为没有默认值,它试图在“零”中度过了。但它不能,因为你的int参数是不可为空。

这条路线可能调试器不检查类型为空。

要解决这个问题:

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


Answer 2:

我想你应该把你的自定义路由默认的

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



Answer 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) {...}


文章来源: ASP.NET MVC routing - trying to have a name in the URL