ASP.Net MVC3 - パラメータとしてのかみそりのマークアップを渡す

私は EditableArea というヘルパーを持っていて、実行時編集可能な div (JS経由)をユーザに提供します。 EditableAreaヘルパーは、指定されたIDを持つ編集可能な領域(MVCの Area に関係しない)がDBに存在するかどうかをチェックし、そうでなければ領域のHTMLをレンダリングします。ヘルパー:

@Html.EditableArea(someId, "

Click to edit contents

")

それはすべてうまく動作しますが、デフォルトのマークアップが文字列ではなく、剃刀構文で指定されるように変更したいと思います。

@using (Html.EditableArea(someId))
{
    

Click to edit contents

}

MVC3で動作する @section のようなものです。

それをどうすれば実現できますか?

TagBuilderなどを閉じる Dispose IDisposable を作成できますが、ヘルパーがIDを持つ領域を見つけたとしても内部Razorマークアップのレンダリングを避けることはできません私はDispose()でレンダリングされた内容をクリアできますが、{}内のコードはまだ実行されますが、スキップします)。

また、 using を使用しないと、かみそりのブロックをヘルパーに渡す他の方法がありますか?実際にはヘルパーによってレンダリングされるかどうかは異なります。

20

3 答え

以下に、テンプレートIdとカミソリスタイルの構文をテンプレート自体に渡して、jQueryテンプレートのマークアップをレンダリングする例を示します。

public static MvcHtmlString jQueryTmpl(this HtmlHelper htmlHelper, 
    string templateId, Func template) 
{
    return MvcHtmlString.Create("<script id=\"" + templateId + 
        "\" type=\"x-jquery-tmpl\">" + template.Invoke(null) + "</script>");
}

これは

@Html.jQueryTmpl("templateId", @any type of valid razor syntax here)

Basically just use Func as your parameter and template.Invoke(null) (with arguments if necessary) to render it. Obviously you can skip the call to .Invoke() to avoid rendering the "default" markup.

25
追加された
テンプレート関数にnullを渡すのはなぜですか?パラメータは何をしますか?
追加された 著者 Triynko,
それは動作しません。関数呼び出し内の ... 構文が認識されていません(無効な式の用語 '<')
追加された 著者 Boris B.,
素晴らしい、それは今働く。かみそりのマークアップが実際にはタグなしのプレーンテキストでない限り、 タグは必要ありません( @ )。 > で十分です。
追加された 著者 Boris B.,
申し訳ありませんが、 の前に「@」をつけてください(私の答えは更新しました)
追加された 著者 Marek Karbarz,
これは タグについては正しいことです。私は自分のテンプレートに入っているものを変更した場合に備えて、それらを使用する傾向があります。将来的にはそれを証明してください。
追加された 著者 Marek Karbarz,

Just to expそしてon the accepted answer, as it took me quite a while to resolve a similar problem そしてthis is the question which popped up. What I really need was a @helper, which would accept razor text, as the template should contain quite some code. I played around for a long while trying to use several versions of type @helper item(Func input), which I found on the web, with no success. Therefore I went for an approach like:

namespace project.MvcHtmlHelpers
{
    public static class HelperExtensions
    {
        public static MvcHtmlString RazorToMvcString(this HtmlHelper htmlHelper, Func template)
        {
            return MvcHtmlString.Create(template.Invoke(null).ToString());
        }
    }
}

そして

@project.MvcHtmlHelpers    
@helper item(other input, MvcHtmlString content)
    {
        <div class="item">
            ...other stuff... 
            <div class="content">
                @content
            </div>
        </div>
    }

そしてuse this via

@item(other input, @Html.RazorToMvcString(@this is a test))

今度は、両方のRazor入力にヘルパーテンプレートを使用できますが、一部の点では便利な部分的なビューをドロップすることもできます。私は専門家がいないので、より良いオプションがあるかもしれませんが、それは私にとっては柔軟なアプローチのようです。

3
追加された

さらにこれを利用すると、拡張メソッドを使用せずにヘルパーに直接マークアップを渡すことができます。

@helper HelperWithChild(Func renderChild)
{
    <div class="wrapper">
        @renderChild(this)
    </div>
}

@HelperWithChild(@

Hello

)

For multi-line markup is required as well:

@HelperWithChild(@
    @AnotherHelper()

    

With more markup

) @helper AnotherHelper() {

Another helper

}

Model でどのように this がどのように再生されるのか分かりませんが、私のヘルパーはパラメータのみを使用します。

0
追加された