【问题标题】:route doesn't work in mvc路由在 mvc 中不起作用
【发布时间】:2015-12-16 06:01:54
【问题描述】:

我有这个动作方法:

 public virtual ActionResult NewsByCategory(int code)
    {...}

我有两个这样的路由器:

routes.MapRoute("lang",
   "{lang}/{controller}/{action}/{id}", 
   new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
   new[] { "CMS.mvcApp.Controllers" });

routes.MapRoute("langCode", 
  "{lang}/{controller}/{action}/{code}", 
  new { controller = "Home", action = "Index", code = UrlParameter.Optional }, 
  new[] { "CMS.mvcApp.Controllers" });

我有以下要求:

locallhost:3354//En/News/NewsByCategory/12345

我收到此错误:

参数字典包含“CMS.mvcApp.Controllers.NewsController”中方法“System.Web.Mvc.ActionResult NewsByCategory(Int32)”的不可为空类型“System.Int32”的参数“代码”的空条目.可选参数必须是引用类型、可空类型或声明为可选参数

为什么它不起作用?

【问题讨论】:

  • /En/News/NewsByCategory/12345matches 你的第一个路由,所以它的值 12345 分配给 idcodenull 因此错误
  • 要么删除第二个路由定义(并将方法更改为NewsByCategory(int id)),要么为NewsByCategory创建一个特定路由。
  • 我想通过第二条路线匹配。我要设置参数名称Code
  • 您无法匹配第二条路线(因为它与第一条路线匹配!)。为什么你特别需要它是 code 只有你知道,但你可以创建一个特定的路线 routes.MapRoute("langCode", "{lang}/News/NewsByCategory/{code}", new { controller = "News", action = "NewsByCategory" }) 但你需要在你的默认路线之前移动它
  • @PsarTak 是的,但它们是可选的,但你得到了答案,路线取决于路线,然后是参数:-)

标签: c# asp.net-mvc asp.net-mvc-4


【解决方案1】:

MVC 正在使用您在 route.config 中声明的第一个路由 文件。 MVC 的工作方式是,一旦找到任何匹配项 路由它不会在您的配置中查找下一个声明的路由。那么你 应始终在列表顶部添加最具体的路线,并且最 列表底部的通用路线。

您也可以使用参数类型的约束。

http://www.asp.net/mvc/overview/older-versions-1/controllers-and-routing/creating-a-route-constraint-cs

【讨论】:

  • 如果您提供的报价来自其他一些 SO 问题 - 请将其标记为重复,无论如何请提供您从中获得报价的位置。
  • @AlexeiLevenkov 我没有从任何地方复制它。我自己加的。
  • 不知道为什么你把它格式化为引号...我已经删除了那个格式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-13
  • 2017-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-01
相关资源
最近更新 更多