【问题标题】:Why ASP.NET MVC not support polymorphism? [duplicate]为什么 ASP.NET MVC 不支持多态性? [复制]
【发布时间】:2013-12-25 12:50:28
【问题描述】:

编译但不工作:

public class ProductController : Controller
{
    public ActionResult List(int a)
    {
        return View();
    }

    public ActionResult List(int a, int b)
    {
        return View();
    }
 }

出现错误:

当前对控制器类型的操作“列表”请求 'ProductController' 在以下操作方法之间不明确: System.Web.Mvc.ActionResult List(Int32) 类型 Shop.Controllers.ProductController System.Web.Mvc.ActionResult Shop.Controllers.ProductController 类型上的 List(Int32, Int32)

我对无法实施的原因感兴趣。

【问题讨论】:

  • ASP.NET MVC 只是一个 Web 框架。它根本不是一种编程语言。我认为没有支持问题..
  • MVC 旨在路由到一个动作,无论您是否实际传递了正确数量的参数。任何缺少的参数都将变为空,而任何额外的参数都将被忽略。因此,它会将您的重载方法视为重复操作。

标签: c# asp.net-mvc


【解决方案1】:

MVC 是一个处理将 http 请求路由到控制器操作的框架。默认情况下,匹配路由时,任何缺少的参数都将作为 null 传递,额外的参数将被忽略。因此,路由引擎会查看您的路由,将其与默认路由路径匹配,并且无法判断它应该调用哪个(它是模棱两可的)。

您可以通过在路由配置中添加显式路由来显式调用预期参数来解决此问题。

【讨论】:

    【解决方案2】:

    好吧,让我们假设您决定编写它而不是 ScottGu 和 Co 编写 ASP.NET MVC。

    您编写了路由处理程序,该处理程序处理到控制器然后到操作的路由

    现在你的 MVC 处理程序开始执行

    它检查路由,确定它的controller = "Some" 所以,实例化(使用反射)SomeController 类,然后它看到action="List" 调用List 方法(操作)。

    现在告诉我们如何区分List(int a) 和List(int a, int b)。

    【讨论】:

      猜你喜欢
      • 2010-11-15
      • 1970-01-01
      • 2016-04-18
      • 2014-03-04
      • 2011-03-17
      • 2011-04-03
      • 1970-01-01
      • 2011-03-24
      相关资源
      最近更新 更多