我正在为NopCommerce开发插件。我想覆盖标有[ChildActionOnly]的动作。
有一个控制器:
ShoppingCartController {
[ChildActionOnly]
public ActionResult FlyoutShoppingCart(){...}
}
我想扩展原始控制器:
NewShoppingCartController : ShoppingCartController {
[ChildActionOnly]
public new ActionResult FlyoutShoppingCart(){...}
}
新关键字在原始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?
答案 0 :(得分:4)
你自己踢,但根本没有指定控制器。
@Html.Action("FlyoutShoppingCart")
现在,它将隐式使用上下文中的任何控制器,即当前主要操作属于哪个。
此外,FWIW,使用new来覆盖是非常笨重的方法来处理这个问题。相反,可以覆盖的基类上的任何内容都应标记为虚拟。
public class ShoppingCartController : Controller
{
[ChildActionOnly]
public virtual ActionResult FlyoutShoppingCart() {...}
}
这实际上为类创建了一个自我记录的API,因此任何使用它的人都可以一目了然地了解扩展点的位置。然后,在您的子类中,您override
而不是new
:
public override ActionResult FlyoutShoppingCart() {...}