2011-12-17 4 views
12

としてビューの内容を取るTexAreaはヘルパーを作成し、私はこのように、ビューのパラメータコンテンツとして受け取ることになるHTMLヘルパーを作成したいと思います:パラメータ

<% Html.MyTextArea("txt1",() => {%> 

content of the view 
<%=Html.TextBox("Name") %> 
... 
<% }) %> 

誰が行う方法を知っていますこの ?

+1

あなたは、あなたが「ビューのパラメータコンテンツとして受け取ることになること」と言っている正確にいつ何を意味するかを明確にしてくださいもらえますか?ありがとう。 –

+0

@KalmanSpeierこれは、 '%><%'の間にヘルパーがあって、レンダリングし、生成されたhtmlの文字列パラメータを取得する場合に意味します – Omu

+0

あなたの入力と期待される出力の例を表示できますか? – Rastapopulous

答えて

5

私が投稿し、それがWebフォームビューエンジンで行うことができるかわかりませんが、このブログをチェック:あなたはMVCとして、それをタグ付けしましたので

Templated Razor Delegates

+0

Phil Haackは優れています。デビッドファウラーも。 –

3

を、私はあなたを提案するつもりです私はmy blogに投稿したようなことができます。なぜなら、内部コンテンツを操作する必要がなく、単に何らかの方法でそれをラッピングすることに興味があれば、ソリューションは非常に似ているので、テンプレートの構文強調を得る方法ですいくつか余分なロジックを必要とする包含要素で)。

この手法を使用すると、HtmlHelperメソッドはブロックのコンテキストを受け取ります。構文はあなたの提案されたテクニックとは若干異なります。コンテキストは、(現在の出力ストリームに書き込むため)ライターが含まれてIDisposableをオブジェクトに渡され

@using(Html.MyTextArea("txt1")) 
{ 
    <some HTML content here> 
} 

たとえば、次のようなものを持つことができます。そこで、複数の要素を出力したり、必要に応じて他の操作を行うことができます。 Disposeは、必要に応じて、閉じた要素を書き込むために使用されます。

だから、あなたはこのようなもので終わる可能性:私はこれは関数自体への内部コンテンツを提供していません述べたように、しかし

<textarea><some HTML content here></textarea> 

Razorページが内側にレンダリングされるため、必要な方法で出力を取得する有効な方法はありません。部分文字列の出力を文字列にキャッシングすることについては、postsがあります(これは、例の内部コンテンツが別のファイル、つまり.ascxファイルにあることを意味するため)。

3

一つのアプローチは、

public static MvcHtmlString TextArea(this HtmlHelper htmlHelper, string name, Action<TextWriter> action) 
    { 
     var writer = new StringWriter(); 
     action(writer); 
     // here writer contains the html 
     return htmlHelper.TextArea(name); 
    } 

    <%:Html.TextArea("txt1",(writer) => { 
     writer.Write("content of the view"); 
     writer.Write(HttpUtility.HtmlEncode(Html.TextBox("Name"))); 
    }) %> 
3

あなたはこのような何かを意味しますか?

namespace System.Web.Mvc { 
    public static class HtmlHelperExtensions { 
     public static MvcHtmlString MyTextArea(this HtmlHelper htmlHelper, string id, Func<MvcHtmlString> helperFunc) { 
      return new MvcHtmlString(string.Format("<div id=\"{0}\">{1}</div>", id, helperFunc())); 
     } 
    } 
} 

あなたはこの方法を使用することができます。

<%: Html.MyTextArea("txt1",() => Html.TextBox("Name", "abc")) %> 
+0

:)いいえ、別のヘルパーをレンダリングするヘルパーではなく、ビューの大きな部分を引数として取るヘルパーです – Omu

+0

この場合、私はまだそれを得ません、 –