如何在mvc .net上使用基本控制器中的操作而不出现“操作不明确”的情况?

时间:2018-07-22 01:32:56

标签: c# asp.net-mvc inheritance asp.net-mvc-routing

比方说,我有一个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类中创建代码。

1 个答案:

答案 0 :(得分:3)

您必须遵循与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都将调用Inside UserController方法。
  • 确保您已从Controller继承了UserController。
  • 如果要在派生类中实现方法的不同版本,则必须将该方法设为虚拟。