【问题标题】:Is there any way to override a MVC Controller Action?有没有办法覆盖 MVC 控制器操作?
【发布时间】:2013-02-04 22:39:44
【问题描述】:

我正在改编一个开源项目 (NopCommerce)。它是一个很棒的软件,并支持使用插件的可扩展性。 对于一个插件,我想向视图添加信息,为此,我想从控制器继承并覆盖我需要更改的操作。 所以这是我的控制器:

public class MyController : OldController{
//stuff

public new ActionResult Product(int productId)
{
 //Somestuff
}

}

我从插件中更改了路由,但是当调用此操作时,我收到以下错误:

当前对控制器类型的“产品”操作请求 'MyController' 在以下操作方法之间不明确: MyPlugin 类型上的 System.Web.Mvc.ActionResult Product(Int32) 类型为 OldController 的 System.Web.Mvc.ActionResult Product(Int32)

有什么方法可以覆盖这个方法吗? (ps:我不能使用override关键字,因为它在OldController中没有标记为virtual、abstract或override)

谢谢, 奥斯卡

【问题讨论】:

  • 不从OldController派生,而是提供包装在MyController 类中的所有OldController 方法怎么样(有点类似于Proxy pattern
  • 如果它被标记为虚拟,它会起作用吗?我会以一种反常的方式认为你所拥有的会奏效
  • 您想要实现哪些无法从当前的 Controller 类轻松扩展?
  • @UweKeim 好主意 :) 我会试试的
  • @Rikon 我不知道,但我不想更改源代码以便能够更新到新版本;)

标签: c# asp.net asp.net-mvc-4 nopcommerce


【解决方案1】:

如果OldController的方法少,就这样重新声明。

public class MyController : Controller 
{
    private OldController old = new OldController();

    // OldController method we want to "override"
    public ActionResult Product(int productid)
    {
        ...
        return View(...);
    }

    // Other OldController method for which we want the "inherited" behavior
    public ActionResult Method1(...)
    {
        return old.Method1(...);
    }
}

【讨论】:

  • 是的,这听起来不错,@Uwe Kleim 在 cmets 中提出了它。 DaveA 听起来他有很好的洞察力,所以我会在尝试这个之前检查他的想法:)
  • @Oscar,根据您的需要,我建议完全按照 ebattulga 的方式从 Controller 类继承 a 。这就是您正在寻找的方法! ;)
【解决方案2】:

当然,在控制器上“按 F12”并查看标记为虚拟的项目

    public override void OnActionExecuting(ActionExecutingContext context)
    {
        if (Request.Headers.TryGetValue("myHeader", out var value))
        {
            HashId = hashid.ToString();
        }
        base.OnActionExecuting(context);
    }

【讨论】:

    猜你喜欢
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    • 2012-08-05
    相关资源
    最近更新 更多