2011-02-08 7 views
0

MVC3で自分のコントロールのセットをコンパイルしようとしています。だから、すべてのHTMLヘルパー拡張を作成するのではなく、私は他のフレームワーク(Telerik、DevExpress)の動作を模倣すると思った。そこで私はItemクラスを提供するために新しいヘルパー拡張を作成しました。その後、ToString()の代わりにレンダリングする方法()

public static IFriendlyComponentFactory Factory(this HtmlHelper helper) 
     { 
      return new FriendlyComponentFactory(helper.ViewContext); 
     } 

そして、私はプロパティを設定することができますので、ここの中から、私は私のオブジェクトを提供するなど

私は@ Html.Factoryを入れた場合は()。グリッド().nameの( "テスト")

それから私は得ます;

MyTest.Extensions.Grid 

私が理解するのは、ToString()の動作です。したがって、ToStringを出力に変更します。

new MvcHtmlString("<h3>Test</h3>").ToString() 

[OK]をクリックすると、HTMLが完全にエンコードされているので、タグが表示され、ページ内にすべて表示されます。うーん。

ToString()を扱い、HTMLを出力しているように見えるTelerikソースで見ることができますが、出力がレンダリングで完了していることがわかりますToString()の出力ではなく、ViewContext Writerに渡します。

最後に、試しました。

@{ Html.Factory().Grid().Render(); } 

そして、私はViewContext.Writerに直接書きました。 Tada、私はHTML出力を得ました。

しかし、私はコードブレースを囲む必要はありませんが、私はクリーナーインターフェイスを提供する方法を理解したいと思います。

どうすればいいですか?

答えて

1

クラスにIHtmlStringインターフェイスを実装します。ただし、出力に直接書き込む方が高速ですので、大きなコントロールの場合は注意してください。

public static implicit operator string(MyTest.Extensions.Grid g) 
{ 
    return g.Render(); 
} 

をかのToString()をオーバーライド:

+0

私は出力への書き込みは私が行きたい道であると考えていますがしかし、私はそれをどのように達成するのかよく分かりません。どのようにして出力に書き込むことができますか? @ Html.Factory()。グリッド()は私のビューですか? – Hammerstein

+0

@は値を書き込むことを期待しています。ToString(またはToHtmlString with IHtmlString)をオーバーライドすることができます。出力に直接書き込んでstring.Emptyを返します。それは動作しますが、私は個人的にはそれをクリーンなソリューションとは考えていません。 –

+0

これを今にすることを心配しているわけではありません。私はきれいなソリューションの後にいます。私はTelerikがそれをどう管理しているかで何かを見逃していると思う。 – Hammerstein

1

オーバーライド暗黙の文字列へのキャストとは、レンダリング返す

public string ToString() 
{ 
    return g.Render(); 
} 
関連する問題