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核心且具有相同控制器名称的情况下就像魅力一样工作。 请帮忙。
答案 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?}");
});