为什么ASP.NET MVC不支持多态性?
为什么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)
我对无法实现的原因很感兴趣。
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处理程序就可以准确调用相应的方法,实现多态性。