2

我有 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”的操作“Category”的请求在以下操作方法之间不明确:System.Web.Mvc.ActionResult Category(Int32, Nop.Web.Models.Catalog.CatalogPagingFilteringModel) 在 Nop 类型上。 Plugin.Common.Web.Controllers.CustomCatalogController System.Web.Mvc.ActionResult Category(Int32, Nop.Web.Models.Catalog.CatalogPagingFilteringModel) on type Nop.Web.Controllers.CatalogController]

编辑 基本控制器位于应用程序的核心,因为 CustomController 在插件中,这意味着我无法修改基本控制器的类型。

4

2 回答 2

4

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

根据:

public virtual ActionResult Category(...) { }

衍生的:

public override ActionResult Category(...) { }
于 2012-11-19T20:48:58.777 回答
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();
  }
}
于 2012-11-19T21:51:09.170 回答