我有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在插件中,这意味着我无法修改基本控制器的类型。
答案 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();
}
}