假设我有一个带有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中实现该方法,那么将调用基方法。
如果不将基本控制器设为虚拟控制器,这两个方法都将被调用,并导致路由不明确的异常。