2

私は2つのコントローラーを持っており、一方は他方を継承しています。nopCommerceのプラグインにページネーションを実装するコードに変更する必要があるため、ベースコントローラーからActionResultをオーバーライドする必要があります。ただし、新しい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'の現在の要求は、次のアクションメソッド間であいまいです:タイプNopのSystem.Web.Mvc.ActionResult Category(Int32、Nop.Web.Models.Catalog.CatalogPagingFilteringModel)。タイプNop.Web.Controllers.CatalogControllerのPlugin.Common.Web.Controllers.CustomCatalogControllerSystem.Web.Mvc.ActionResultCategory(Int32、Nop.Web.Models.Catalog.CatalogPagingFilteringModel)]

編集 ベースコントローラーはアプリケーションのコアにありますが、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 に答える