覆盖不适用于ASP.net Core MVC中的虚拟方法

时间:2018-07-15 14:55:34

标签: c# asp.net-core-mvc

namespace ProjectA.Controllers
public partial class CustomerController : Controller
{
 public virtual IActionResult Index()
 {
  ...Some code here
 }

 public virtual IActionResult Login()
 {
  ...Some code here
 }
}


namespace ProjectB.Controllers
public partial class CustomerController : ProjectA.Controllers.CustomerController
{
 public override IActionResult Login()
 {
  ...Some code here
 }
}

当我尝试像上面那样覆盖时,它给了我下面的错误

  

AmbiguousActionException:多个动作匹配。   以下操作与路线数据匹配,并且满足所有约束条件:   ProjectA.Controllers.CustomerController.Index(ProjectA)   ProjectB.Controllers.CustomerController.Index(ProjectB)

尽管ProjectB中没有索引操作。当我将ProjectB的控制台名称更改为:

namespace ProjectB.Controllers
public partial class CustomCustomerController : ProjectA.Controllers.CustomerController
{
 public override IActionResult Login()
 {
  ...Some code here
 }
}

AmbiguousActionException 消失了,但替代仍然无效。我没有在覆盖操作中接到电话。 .Net核心是否不再支持重写,因为它在没有.net核心且具有相同控制器名称的情况下就像魅力一样工作。 请帮忙。

1 个答案:

答案 0 :(得分:1)

因为两个类名都为“ CustomerController”。而且两者都可能使用默认路由。因此,对于两个控制器,URL应该与/{controller}/{action}相同。

因此对于相同的URL,每个控制器将有2个操作可用。这就是为什么您得到

  

“ AmbiguousActionException”异常。

当您将子控制器更改为“ CustomCustomerController”时,两个控制器的url都将更改,因此不会出现此类歧义,因此可以正常工作。

正如您所说,覆盖无效。在这种情况下,您必须使用url作为“ / CustomCustomer / login”,然后它将转到CustomCustomerController的Login操作。

编辑1

您可以按以下方式更新代码,它应该可以正常工作。如下创建控制器:

namespace ProjectA.Controllers {
    public partial class CustomerController : Controller
    {
        public virtual IActionResult Index()
        {
            ...Some code here
        }

        public virtual IActionResult Login()
        {
            ...Some code here
        }
    }
}

namespace ProjectB.Controllers {
    public partial class CustomCustomerController : ProjectA.Controllers.CustomerController
    {
        public override IActionResult Login()
        {
            ...Some code here
        }
    }
}

并将app.UseMvc(routes =>部分更新为startup.cs,如下所示。在customer路由之前添加default路由。

app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "customer",
        template: "customer/{action}/{id?}",
        defaults: new { controller = "CustomCustomer", action = "Index" });

    routes.MapRoute(
        name: "default",
        template: "{controller=Home}/{action=Index}/{id?}");
});