【问题标题】:controller inheritance: how to override controller's action and force using new action when Html.Action is called控制器继承:如何在调用 Html.Action 时覆盖控制器的动作并强制使用新动作
【发布时间】:2015-08-03 15:26:33
【问题描述】:

我正在为 NopCommerce 开发插件。我想覆盖标有 [ChildActionOnly] 的操作。

有一个控制器:

ShoppingCartController {

[ChildActionOnly]
public ActionResult FlyoutShoppingCart(){...}

}

我想扩展原来的控制器:

NewShoppingCartController : ShoppingCartController {

[ChildActionOnly]
public new ActionResult FlyoutShoppingCart(){...}

}

a new 关键字在原始 impl 中使用 b/c 操作不是虚拟的

在 RouteProvider 中,我像这样覆盖路由:

RouteTable.Routes.Remove(RouteTable.Routes["ShoppingCart"]);

routes.MapLocalizedRoute("ShoppingCart",
                           "cart/",
                            new { controller = "NewShoppingCart", action = "Cart" },
                            new[] { "mynamespace" });

所以这对于普通动作来说很好,但不适用于仅子动作 b/c,它是使用 Html.Action 调用的,其中指定了控制器:

@Html.Action("FlyoutShoppingCart","ShoppingCartController",...)

这意味着将在这里调用原始控制器,因此我必须重写视图来替换这样的调用:

@Html.Action("FlyoutShoppingCart","NewShoppingCartController",...)

或 @Html.Action("FlyoutShoppingCart",...)

有没有办法避免更改视图,并强制使用 NewShoppingCartController 而不是 ShoppingCartController?

【问题讨论】:

  • 我认为你也应该尝试一个子动作的路线。作为子动作使用与常规动作相同的路由。就像您为Cart 操作创建了一条路线一样,也为FlyoutShoppingCart 创建了另一条路线

标签: asp.net-mvc asp.net-mvc-routing nopcommerce


【解决方案1】:

你会踢自己,但不要指定控制器。

@Html.Action("FlyoutShoppingCart")

现在,它将隐式使用上下文中的任何控制器,即当前主要操作所属的任何控制器。

另外,FWIW,使用 new 来覆盖是非常笨拙的方式来处理这个问题。相反,基类中任何可以被覆盖的东西都应该被标记为虚拟的。

public class ShoppingCartController : Controller
{

    [ChildActionOnly]
    public virtual ActionResult FlyoutShoppingCart() {...}

}

这实际上为该类创建了一个自记录 API,因此任何使用它的人都可以一眼看出扩展点在哪里。然后,在您的子类中,您使用override 而不是new

public override ActionResult FlyoutShoppingCart() {...}

【讨论】:

  • 我正在开发一个插件,基本实现与我描述的一样,没有虚拟,视图也是标准的,我不想接触标准实现或以最小的方式接触它
  • 我写的第二部分只是建议;它不适用于您的特定问题的解决方案。但是,除非您确实无法访问基类,否则不建议隐藏方法。使用new 只是隐藏了基类上的方法或属性;它不会覆盖它。我实际上从未尝试将new 与控制器操作组合使用,但在其他情况下,我看到了由属性隐藏引起的冲突,尤其是在涉及反射时。
猜你喜欢
  • 2012-02-20
  • 1970-01-01
  • 1970-01-01
  • 2012-11-30
  • 1970-01-01
  • 2011-05-23
  • 1970-01-01
  • 2010-09-29
  • 1970-01-01
相关资源
最近更新 更多