我可以在与基本控制器具有相同签名的ActionResult上使用方法隐藏吗?

时间:2012-11-19 20:45:08

标签: asp.net-mvc nopcommerce

我有2个控制器,一个继承另一个。我需要从基本控制器覆盖ActionResult,因为我需要更改为代码以在nopCommerce的插件中实现分页。但是,由于新的ActionResult,我得到一个AmbiguousMatchException。

基础控制器:

public class BaseController : Controller {
    public ActionResult Category(int categoryId, CatalogPagingFilteringModel command)
    {
        //original action result code
    }
}

客户控制器/继承

public class CustomController : BaseController {
    public new ActionResult Category(int categoryId, CatalogPagingFilteringModel command)
    {
        // my pagination code with different model/view
    }
}

路线信息: 在这里,我删除了基本控制器的路由,并添加了一个新路由以使用CustomCatalog控制器。

routes.Remove(routes["OriginalCategory"]);
            routes.MapLocalizedRoute(
                            "OriginalCategory",
                            "Category/{categoryId}/{SeName}",
                            new { controller = "CustomCatalog", action = "Category", SeName = UrlParameter.Optional },
                            new { categoryId = @"\d+" },
                            new[] { "Nop.Plugin.Common.Web.Controllers" });

然后我得到一个AmbiguousMatchException

  

[AmbiguousMatchException:当前的操作请求'类别'   控制器类型'CustomCatalogController'之间是不明确的   以下操作方法:System.Web.Mvc.ActionResult类别(Int32,   Nop.Web.Models.Catalog.CatalogPagingFilteringModel)类型   Nop.Plugin.Common.Web.Controllers.CustomCatalogController   System.Web.Mvc.ActionResult类别(Int32,   Nop.Web.Models.Catalog.CatalogPagingFilteringModel)类型   Nop.Web.Controllers.CatalogController]

修改 基本控制器驻留在应用程序的核心,其中CustomController在插件中,这意味着我无法修改基本控制器的类型。

2 个答案:

答案 0 :(得分:4)

如何在基本控制器中使用virtual而在派生控制器中使用override而不是new

public virtual ActionResult Category(...) { }

衍生的:

public override ActionResult Category(...) { }

答案 1 :(得分:2)

您无法覆盖尚未声明为virtual的方法。

您可以使用不同的签名定义新方法,也可以通过在包装类中维护对其的私有引用来封装原始类的功能。如果您有一个可以从基本库实现的接口(因为这允许您替换将使用实现相同接口的基类的包装器类),它会有所帮助,但您也可以在没有接口的情况下执行此操作。

// Base class source code is not modifiable
class BaseClass {
   public ActionResult Category(...) {}
   public ActionResult Other() {}
}

// Wrapper class can modify the behavior
class Wrapper {
  private BaseClass baseClass = new BaseClass();  // Instantiate appropriately

  public ActionResult Category(...) {
    // do some stuff
  }

  public ActionResult Other() {
    return baseClass.Other();
  }
}