c# - 如何在 mvc .net 上使用基本控制器中的 Action 而没有“动作不明确”?
问题描述
假设我有UserController
一个Details(string id)
动作。
我想创建一个名为的新类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 上调用,浏览器会显示以下错误:
“未找到视图'详细信息'或其主视图或没有视图引擎支持搜索的位置”
如何让我的 Web 应用程序将Client/Details/xxxx请求用作User/Details/xxxx而无需在 Clients 类中创建代码。
解决方案
您必须遵循与 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 class UserController : Controller
{
public ActionResult Details(string id)
{
return Json("Test", JsonRequestBehavior.AllowGet);
}
}
public class ClientController : UserController
{
}
- 在这种情况下,对于 /Client/Details/1 或 /User/Details/1,它将调用 UserController 内部的方法。
- 确保您从 Controller 继承了 UserController。
- 如果要在派生类中实现不同版本的方法,则必须使该方法成为虚拟方法。
推荐阅读
- mysql - MySQL 在将新的 ENUM 值添加到现有的 ENUM 列时是否获得锁?
- javascript - TypeError:制作狙击命令时无法读取未定义的属性“get”
- swift - 使用列表中的 .onDelete 从 CoreData 关系中删除项目
- php - 如何在 WordPress 查询中查询相关产品帖子标题而不是整个帖子对象数组?
- python - 分隔包含一组或两组括号的字符串列
- sql - 从众多类别中选择仅属于一个类别的行
- javascript - 如何在shopify中带来最后一次用户购买?
- python - 检查Python中的多键字典中是否存在集合的元素?
- php - 如何在 Laravel 中将产品数组的价格与其数量相加
- java - 在 LibGDX 中设置窗口模式分辨率会出错