首页 > 解决方案 > 如何在 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#asp.net-mvcinheritanceasp.net-mvc-routing

解决方案


您必须遵循与 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。
  • 如果要在派生类中实现不同版本的方法,则必须使该方法成为虚拟方法。

推荐阅读