2016-10-24 6 views
1

私はasp.netコアで遊んでいて、私のヘルパーをそれに移行しようとしていました。自分のヘルパーをビューに注入しましたが、デフォルトのIHtmlHelperにアクセスする必要がありました(私はHtmlHelperを拡張したくありません)。IHtmlHelperリファレンスのカスタムカミソリヘルパー

私はIoCから具体的なIHtmlHelperを取得するために、このようなコンストラクタを構築しました。

public FWHtmlHelper(IHtmlHelper htmlHelper) 
{ 
     this._htmlHelper = htmlHelper; 
} 

事は、私がヘルパーにアクセスしようとしたとき、私はこのエラーを得た、次のとおりです。

InvalidOperationException: Must call 'Contextualize' method before using this HtmlHelper instance.

だから、どのように私は自分のヘルパーを作成し、表示HTMLヘルパーのインスタンスにアクセスすることができますか?

*編集、要求通り:

services.AddTransient(typeof(IFWHtmlHelper<>), typeof(FWHtmlHelper<>)); 

ビュー次に

@inject IFWHtmlHelper<TModel> FWHtml 

にそれを注入し、私は私のヘルパー

public static TagBuilder Example<TModel, TValue>(this IFWHtmlHelper<TModel> fwHelper, Expression<Func<TModel, TValue>> expression) 
{} 
の拡張子を作成したコンテナに追加
+0

を望んでいるようにそれがアップ配線されますので、プライベートIHtmlHelperの上でそのコンテクスチュアリゼーションを渡すにはどのようにこのクラスをインスタンス化/登録していますか?この問題を再現するサンプルコードを提供できますか? –

+0

さて、IoCに "services.AddTransient(typeof(IFWHtmlHelper <>)、typeof(FWHtmlHelper <>));というインターフェイスを追加します。それをビューに挿入するIFWHtmlHelper FWHtml。次に、私はヘルパーの拡張をpublic static TagBuilder Example で作成しました(このIFWHtmlHelper fwHelper、Expression >式){} –

+0

エラーとして「IHtmlHelper」は'Contextualize'メソッドを呼び出すことによって提供される' ViewContext'を定義します。 'IHtmlHelper'の上に直接拡張機能を作成したり、タグヘルパーを作成してみませんか? –

答えて

1

私はこの同じ問題を抱えていました。 MVCはIHtmlHelperを一時的スコープ依存として追加するので、ビューと同じIHtmlHelperを取得しません。 MVCは他のインスタンスを文脈化しますが、あなたのクラスはプライベートなものではありません。

私のソリューションは、DIが、渡されたことをプライベート(過渡)IHtmlHelperを文脈とした。これを行うには、IViewContextAwareを実装し、それが

public partial class MyHelper : IViewContextAware {   
     public MyHelper(IHtmlHelper htmlHelper) { 
      this.Html = htmlHelper;       
     } 
     public IHtmlHelper Html { 
      get; 
      private set; 
     } 

     void IViewContextAware.Contextualize(ViewContext viewContext) { 
      if (Html is IViewContextAware) { 
       ((IViewContextAware)Html).Contextualize(viewContext); 
      } 
     } 
    }