控制器继承:如何在调用Html.Action时使用新操作覆盖控制器的操作和强制

时间:2015-08-03 15:26:34

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

我正在为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?

1 个答案:

答案 0 :(得分:4)

你自己踢,但根本没有指定控制器。

@Html.Action("FlyoutShoppingCart")

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

此外,FWIW,使用new来覆盖是非常笨重的方法来处理这个问题。相反,可以覆盖的基类上的任何内容都应标记为虚拟。

public class ShoppingCartController : Controller
{

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

}

这实际上为类创建了一个自我记录的API,因此任何使用它的人都可以一目了然地了解扩展点的位置。然后,在您的子类中,您override而不是new

public override ActionResult FlyoutShoppingCart() {...}