为什么ASP.NET MVC5中不能重载?
我在控制器中有一个称为索引的操作。这可以被称为如下所示:为什么ASP.NET MVC5中不能重载?,asp.net,Asp.net,我在控制器中有一个称为索引的操作。这可以被称为如下所示: public ActionResult Index() { return View(); } [MyCustomAttribute] public ActionResult Index(StatusEnum status) { return View(); } [MyCustomAttribute] public ActionResult Inde
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) {
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();
}
在这种情况下,处理第一个操作的所有请求(不带参数)和第二个操作的其余请求应该非常清楚,没有问题。我认为这很奇怪,因为在原生C#中,进行此类重载绝对没有问题
第二点:无论出于何种原因,重载都是不可能的,我该如何处理?排除不带参数的索引操作(如果可能)是没有选项的,因为我也在其他控制器中使用该属性,并且应该处理所有索引操作 当我有这个URL时:
http://www.test.com/
你认为这条路线会把你带到哪里?显然,它可以进入Index()
操作,但为什么它不能进入索引(StatusEnum status,DateTime date)
操作?这两个参数都可以为null,因此它们只能为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();
}
虽然从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();
}
routes.MapMvcAttributeRoutes();
将此行添加到RouteConfig.cs以启用属性路由
[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();
}
routes.MapMvcAttributeRoutes();
我认为,当我有一个像DateTime date这样的参数时,这是必需的,不能为null,除非我通过添加问号使其显式为null。在你看来,不允许超载是可以理解的,谢谢。但我认为在这种情况下,当默认参数不能为null时,它会更有意义,因为这样就有可能重载。