我们有一个路由配置,如下所示:ASP.NET路由在两个控制器动作有相同数量的参数
public static void RegisterRoutes(RouteCollection routes) {
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "About",
url: "{controller}/{action}/{aboutId}",
defaults: new { controller = "Home", action = "About" }
);
routes.MapRoute(
name: "Contact",
url: "{controller}/{action}/{contactId}",
defaults: new { controller = "Home", action = "Contact" }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
你会发现,有两条路有一个强制性的额外的参数。路线About
和Contact
。
在我们的应用程序,我们有两个URL
www.myapp.com/Home/About/2
工作正常。 但是,当我们浏览我们的浏览器www.myapp.com/Home/Contact/5
我们得到可怕的路由例外:
The parameters dictionary contains a null entry for parameter 'contactId' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ActionResult Contact(Int32)' in 'RoutingTest.Controllers.HomeController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.
如果我们改变路由的序列,使得它看起来像这样:
public static void RegisterRoutes(RouteCollection routes) {
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Contact",
url: "{controller}/{action}/{contactId}",
defaults: new { controller = "Home", action = "Contact" }
);
routes.MapRoute(
name: "About",
url: "{controller}/{action}/{aboutId}",
defaults: new { controller = "Home", action = "About" }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
然后Contact
网址作品但About
网址没有。
HomeController的是这样的:
public class HomeController : Controller {
public ActionResult Index() {
ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application.";
return View();
}
public ActionResult About(int aboutId) {
ViewBag.Message = "Your app description page.";
return View();
}
public ActionResult Contact(int contactId) {
ViewBag.Message = "Your contact page.";
return View();
}
}
什么这似乎意味着是两个路线不能有相同数量的参数,无论是控制器的名字。如果两个控制器动作具有相同名称的参数,则所有工作都正常。我知道我可以开始做非常黑客的事情来解决这个问题,比如调用所有的参数相同的名字,或者给出无意义的参数来改变参数的数量,但我实际上想知道底下发生了什么。
我该如何解决这个问题?
老实说,我不明白为什么你需要在这种情况下,3条不同的路线。所有你需要做的就是删除非默认路由,并用id替换'aboutId'和'contactId'。一切都应该工作... – Aron 2013-04-23 02:48:08
@Aron:这当然是一个人为的例子来证明这个问题。我们有多个不同参数的控制器动作。将它们命名为同样的东西会严重降低代码的可读性。 – 2013-04-23 03:46:13