为什么ASP.NET MVC不支持多态性?

16 浏览
0 Comments

为什么ASP.NET MVC不支持多态性?

编译通过但无法工作:

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

出现错误:

在类型为 'ProductController' 的控制器上,针对操作 'List' 的当前请求在以下操作方法之间存在歧义:

Shop.Controllers.ProductController 类型上的 System.Web.Mvc.ActionResult List(Int32)

Shop.Controllers.ProductController 类型上的 System.Web.Mvc.ActionResult List(Int32, Int32)

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

0
0 Comments

为什么ASP.NET MVC不支持多态性?

ASP.NET MVC是一个处理将HTTP请求路由到控制器操作的框架。默认情况下,当匹配路由时,任何缺失的参数都会被传递为null,并且额外的参数会被忽略。因此,路由引擎会查看您的路由,将其与默认路由路径进行匹配,并且无法确定应该调用哪个(这是模糊的)。

您可以通过在路由配置中添加显式路由来绕过此问题,明确指定预期的参数。

0
0 Comments

ASP.NET MVC不支持多态的原因是,它无法区分具有不同参数的同名方法。在ASP.NET MVC中,当路由处理程序将请求路由到控制器和操作时,MVC处理程序会使用反射实例化相应的控制器类,并调用相应的操作方法。然而,由于方法重载的存在,例如在控制器类中有两个同名方法,一个接受一个整数参数,另一个接受两个整数参数,MVC处理程序无法准确区分应该调用哪个方法。

解决方法是使用不同的方法名称来区分具有不同参数的方法,以避免方法重载。这样,MVC处理程序就可以根据方法名称来调用正确的方法。

以下是修改后的代码示例:

public class SomeController : Controller
{
    public ActionResult ListOne(int a)
    {
        // 方法实现
        return View();
    }
    
    public ActionResult ListTwo(int a, int b)
    {
        // 方法实现
        return View();
    }
}

在这个示例中,我们将原来的同名方法"List"分别修改为"ListOne"和"ListTwo",根据方法名称的不同,MVC处理程序就可以准确调用相应的方法,实现多态性。

0