【问题标题】:How to override an Action method in Mvc如何覆盖 Mvc 中的 Action 方法
【发布时间】: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


【解决方案1】:

您的请求需要使用 OrderController 而不是 EcommerceOrderController,请查看您的 MVC routes

【讨论】:

    【解决方案2】:

    在我看来这是一个路由问题。如果您的路线仍然指向原始路线,您是否覆盖控制器并不重要。如果您想要一个 URL 来调用您的操作,您需要添加一个优先级高于当前解析为原始路由的路由。

    【讨论】:

    • 所以,为了清楚起见,您的意思是要完全抛开最重要的东西......只需创建一个不同的控制器和动作来指向自定义路由,对吧?
    • 是的。路由控制调用哪个控制器和操作。
    猜你喜欢
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多