2012-02-06 14 views
20

EditableAreaというヘルパーがあり、実行時に編集可能なdiv(JS経由)をユーザーに提供しています。指定されたIDを持つ編集可能領域は(MVCのAreaとは関係ありません)DBに存在する場合EditableAreaヘルパーをチェックし、そうそれは地域のHTMLをレンダリングする場合は、それ以外の場合は、ヘルパーのパラメータとして指定されたデフォルトのマークアップを表示します。ASP.Net MVC3 - パラメーターとしてパラメータを渡す

それはすべてがOKに動作しますが、私は、デフォルトのマークアップがない文字列としてではなく、かみそりの構文で指定されるように、それを変更したいのですが、のようなもの:@sectionの方法のように、

@using (Html.EditableArea(someId)) 
{ 
    <p>Click to edit contents</p> 
} 

または類似のものMVC3で動作します。

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

私はそれにDisposeIDisposable等、TagBuilderを閉じますが、私は(私が(廃棄にレンダリングされた内容を消去することができます)ヘルパーは、IDとエリアを見つけた場合でも、内部レイザーマークアップをレンダリング避けることができないことができます{}内のコードはまだ実行されますが、これをスキップします)。

私がusingを使用しない場合、実際にヘルパーによってレンダリングされるかどうかにかかわらず、かみそりのブロックをヘルパーに渡す方法がありますか?

答えて

25

ここで私は、テンプレート自体のためのテンプレートIDとかみそりスタイルの構文を渡すことによってjQueryのテンプレートマークアップのレンダリングに使用例を示します

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

、これは

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

で呼び出されます基本的にはパラメータとしてFunc<object, HelperResult>を使用し、レンダリングにはtemplate.Invoke(null)(必要に応じて引数付き)を使用してください。明らかに、「デフォルト」マークアップを避けるために.Invoke()への呼び出しをスキップすることができます。

+0

それは動作しません。 'が...関数呼び出しの内部'構文が認識されていない(無効な式の用語「<」)「と –

+0

申し訳ありませんが、先頭に追加 '' @ '(私は私の答えを更新しました)グレート –

+1

は、それが機能するようになりました。剃刀のマークアップが実際にはタグなしのプレーンテキストでない限り、 ''タグはまったく必要ありません( '@'で十分です)。そうでなければ '@'で十分です。 –

3

それは同じような問題を解決するために私にはかなり時間がかかりましたし、これはポップアップ質問であるとしてだけで、受け入れ答えに拡大します。私が本当に必要としているのは@helperでした。これは、テンプレートにかなりのコードが含まれているはずなので、ひげのテキストを受け入れます。私は長年試していましたが、Webで見つけたタイプ@helper item(Func<object, HelperResult> input)のいくつかのバージョンを使用しようとしましたが、成功しませんでした。今、私は両方のカミソリ入力のためのヘルパーテンプレートを使用することができます

@item(other input, @Html.RazorToMvcString(@<text>this is a test</text>)) 

経由

namespace project.MvcHtmlHelpers 
{ 
    public static class HelperExtensions 
    { 
     public static MvcHtmlString RazorToMvcString(this HtmlHelper htmlHelper, Func<object, HelperResult> 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> 
    } 

、これを使用しますが、私はまた、次のことができます。したがって、私のようなアプローチのために行ってきました一部の点で便利な部分的なビューでドロップします。私は専門家がいないので、より良いオプションがあるかもしれませんが、それは私にとっては柔軟なアプローチのようです。

関連する問題