为什么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();
    }
  • 无参数
  • 使用custon枚举
  • 有约会时间
  • 我有一个自定义属性,应该设置为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();
        }
    
    在这种情况下,处理第一个操作的所有请求(不带参数)和第二个操作的其余请求应该非常清楚,没有问题。我认为这很奇怪,因为在原生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时,它会更有意义,因为这样就有可能重载。