2012-11-19 24 views
2

我有2個控制器,一個繼承另一個。我需要重寫基本控制器的ActionResult,因爲我需要更改代碼以在nopCommerce的插件中實現分頁。但是,由於新的ActionResult,我得到AmbiguousMatchException。我可以使用隱藏在與基本控制器具有相同簽名的ActionResult上的方法嗎?

基本控制器:

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

客戶控制器W /繼承

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上型 Nop.Plugin.Common.Web.Controllers.CustomCatalogController System.Web.Mvc.ActionResult類別(的Int32, Nop.Web類別(的Int32, Nop.Web.Models.Catalog.CatalogPagingFilteringModel)。 Models.Catalog.CatalogPagingFilteringModel)上型 Nop.Web.Controllers.CatalogController]

EDIT 基部控制器駐留在應用程序,其中作爲CustomController是在插件意味着我不能修改的核心基本控制器的類型。

回答

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(); 
    } 
} 
4

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

基地:

public virtual ActionResult Category(...) { } 
衍生

public override ActionResult Category(...) { } 
+0

不幸的是我不能改變基本ActionResult的類型,因爲它是核心的一部分而不是插件的一部分。 –

相關問題