ASP.Net MVC Action方法覆盖

时间:2011-01-27 10:13:39

标签: asp.net-mvc

控制器是否允许覆盖操作方法?

例如:
我可以使用两种方法:

ActionResult SendResults() { ... }
FileContentResult SendResults() { ... }

3 个答案:

答案 0 :(得分:2)

C#不可能,Asp.net MVC动作方法可能

如果您可以通过操作方法选择器可以分离的任何内容来区分控制器操作方法,那么可以使用两个具有相同名称但结果不同的控制器操作:

[HttpGet]
[ActionName("SendResults")]
ActionResult SendResultsGet() { ... }

[HttpPost]
[ActionName("SendResults")]
FileContentResult SendResultsPost() { ... }

这里的主要思想是您可以使用ActionNameAttribute来命名具有相同名称的多个操作方法。基于其他操作方法,这些操作的选择器属性将被执行。

如果没有可以使用的开箱即用的操作方法选择器,您可以随时编写自己的自定义操作方法来解决您的问题。

我写了两篇关于你可能感兴趣的动作方法选择器的博客文章:

答案 1 :(得分:1)

你永远不会有两种方法只有.Net中的返回类型不同。代码如何知道选择哪一个?

请考虑以下代码:

ActionResult result = SendResults();

由于FileContentResult是从ActionResult派生的,因此该代码无法告诉您要调用哪个方法。你必须做类似的事情:

ActionResult result = SendFileContentResults();

C#根据方法名称和参数确定其签名。为了能够创建另一个方法,你必须有另一个签名,并且由于返回类型不在签名中,你必须更改名称或参数以使其编译。

答案 2 :(得分:0)

  • 要覆盖 - 方法需要具有相同的返回类型。
  • 要过载 - 方法需要有不同的签名。

如果您需要根据某些条件返回不同的结果,您可以执行以下操作:

        public ActionResult SendResults()
        {
            if (somecondition)
            {
                return View();
            }
            else
            {
                return File("readme.txt", "text");
            }
        }