【发布时间】:2016-08-05 03:21:13
【问题描述】:
我正在为 Mvc 使用 Cms。此 Cms 具有以下控制器:
public class OrderController : Controller
{
public ActionResult Index()
{
return View();
}
}
出于自定义需求,我想覆盖此控制器的行为,并在用户访问相同的 URL 时返回不同的内容。实现这一结果的最佳方法是什么?
我尝试继承 Cms 控制器并使 ActionResult 成为覆盖,遵循以下答案:How to override controller actionresult method in mvc3?
public class OrderController : Cms.Areas.Admin.Controllers.OrderController
{
public override ActionResult Index(Guid orderItemId)
{
// Do extra stuff
return View();
}
}
但这不起作用。当我尝试导航“管理员/订单”时,我仍然输入 Cms 控制器/操作。
有什么建议吗?
注意:我试图覆盖的控制器位于另一个程序集中,并且操作设置为虚拟。它在一个区域中,因此路由是在 AreaRegistration 中配置的。
【问题讨论】:
-
I'm using a Cms for Mvc- 有大量使用 MVC 且可定制的 CMS 平台,更不用说它也可以是自家开发的。如果不知道您正在尝试使用哪一个并提供定制,没有人可以回答这个问题。请提供您正在使用的平台以及您尝试连接到该平台的方式。 -
实际上,我正在构建 Cms 本身,因此我可以根据需要更改代码。我正在寻找一种巧妙的方法来实现开发人员能够覆盖的控制器
-
好的,下一个问题。
But this doesn't work.- 在我看来它可能确实有效。您的覆盖代码没有定义新视图,它返回与它覆盖的方法相同的结果,这将产生相同的视图。要对此进行测试,请在您的覆盖代码中设置一个断点,或者使用字符串参数View("Other");返回一个不同的视图,您也不能在父级上没有virtual的情况下使用关键字override。最后,您必须考虑路由,您如何定义路由以便使用新控制器? -
是的,我简化了我在这里粘贴的代码,实际的代码做了一些不同的事情。我还尝试了一个断点:它没有被击中。我在父级中使用了虚拟。
-
最后我提到了路由,您的路由配置可能没有设置为访问您的控制器,或者您使用的 URL 不指向它。确保您的路由配置正确。
标签: c# asp.net-mvc