我在控制器中有一个名为Index的Action。这可以像下面这样调用:
我有一个自定义属性,应该设置为2.和3.但不是1。 所以我尝试了以下内容:
public ActionResult Index() {
return View();
}
[MyCustomAttribute]
public ActionResult Index(StatusEnum status) {
return View();
}
[MyCustomAttribute]
public ActionResult Index(DateTime date) {
return View();
}
这似乎不可能,我总是得到一个错误,索引是模棱两可的。但我真的不明白为什么:动作有不同的参数,所以用参数区分它们应该没问题。
当我尝试这样的事情时,我得到同样的错误:
public ActionResult Index() {
return View();
}
[MyCustomAttribute]
public ActionResult Index(StatusEnum status, DateTime date) {
return View();
}
在这种情况下,它应该是真正清除的,没有问题来处理没有参数的所有请求到第一个Action而其余的请求到第二个Action。我觉得这很奇怪,因为在原生C#中,制作这样的重载绝对没有问题。
第二点:当出现任何不可能的重载时,我该如何处理?排除没有参数的Index-Action(如果可能)是没有选项的,因为我也在其他控制器中使用该属性,并且应该处理所有Index-Actions。
答案 0 :(得分:5)
虽然从C#角度来看,重载是有意义的,但MVC路由不知道如何处理一些重载。如果在属性路由...
中使用了类型化参数,则可以使重载起作用[Route("controller/action")]
public ActionResult Index() {
return View();
}
[MyCustomAttribute]
[Route("controller/action/{status:int}")]
public ActionResult Index(StatusEnum status) {
return View();
}
//
[MyCustomAttribute]
[Route("controller/action/{date:datetime}")]
public ActionResult Index(DateTime date) {
return View();
}
将此行添加到RouteConfig.cs以启用属性路由...
routes.MapMvcAttributeRoutes();
答案 1 :(得分:4)
当我有这个网址时:
http://www.test.com/
您认为这条路线会带您到哪里?它可以明显地进入Index()
行动,但为什么它不能进入Index(StatusEnum status, DateTime date)
行动呢?这两个参数都可以为空,因此它们只是null。
重点是路由引擎不知道你想要什么,也许你想要有空参数,也许不是。
您可以尝试这样的事情:
public ActionResult Index() {
return View();
}
[Route("SetStatus/{status}")]
public ActionResult Index(StatusEnum status) {
return View();
}
[Route("SetDate/{date}")]
public ActionResult Index(DateTime date) {
return View();
}