如何在没有 mvc .net 上"action is ambiguous"的情况下使用来自基本控制器的操作?



假设我有一个带有Details(string id)操作的UserController

我想创建一个名为ClientController的新类,它继承自UserController

public class ClientController : UserController 
{ 
}
public class UserController 
{ 
public ActionResult Details(string id)
{
var user = userService.GetById(id);
return View(user);
}
}

当我想向Client/Details/xxxxx发出请求时,问题就出现了。浏览器显示错误

"用户…详细信息和客户…详细信息之间的操作不明确">

如果我清空客户端类并直接调用浏览器Client/Details/xxxx,浏览器会显示以下错误:

"未找到视图‘Details’或其主视图,或者没有视图引擎支持搜索的位置">

如果不在Clients类中创建代码,我如何使我的web应用程序以User/Details/xxxx的身份使用Client/Details/xxxx请求。

您必须遵循与C#相关的基本OOPS

public class UserController : Controller
{
// GET: User
public virtual ActionResult Index()
{
return Json("User Controller", JsonRequestBehavior.AllowGet);
}
}
public class ClientController : UserController
{
// GET: User
public override ActionResult Index()
{
return Json("Client Controller", JsonRequestBehavior.AllowGet);
}
}

您必须使基类方法为Virtual,才能被派生类覆盖。

Now http://<<your host>>/User/Index Call UserController method.
Now http://<<your host>>/Client/Index Call ClientController method.

更新1

若要使用基类方法,那个么就不要在派生类中实现相同的方法。保持基类方法为public或public virtual。

public class UserController : Controller
{
public ActionResult Details(string id)
{
return Json("Test", JsonRequestBehavior.AllowGet);
}
}
public class ClientController : UserController
{
}
  • 在这种情况下,对于/Client/Details/1或/User/Details/1,它将调用方法Inside UserController
  • 请确保您已从Controller继承了UserController
  • 如果要在派生类中实现不同版本的方法,则必须使该方法成为虚拟方法

使基类方法,public虚拟。。。((使派生类方法为public重写。。。。((这只会在派生方法到达派生控制器时执行该方法。

如果您没有在派生的Controller中实现该方法,那么将调用基方法。

如果不将基本控制器设为虚拟控制器,这两个方法都将被调用,并导致路由不明确的异常。

最新更新