为什么ASP.NET MVC5中的重载不可能?

时间:2014-02-25 00:23:46

标签: asp.net

我在控制器中有一个名为Index的Action。这可以像下面这样调用:

  1. 没有参数
  2. 使用custon enum
  3. 使用日期时间
  4. 我有一个自定义属性,应该设置为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。

2 个答案:

答案 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();
}