0

@Html.TextBoxFor に似たものを実装したいのですが、代わりに @Html.SwitchFor() を呼び出して、毎回追加の html とクラスを追加することなく、使用している bool から yes/no スイッチを作成します。

かみそりの構文でこれを行う方法はありますか?

4

2 に答える 2

1

あなたはおそらくこれで運がいいでしょう。

Visual StudioでTextBoxForの上にカーソルを置いてF12をクリックすると、模倣しようとしているメソッドのシグネチャが表示されることに注意してください。時間がかからないと読むのは少し難しいですが、ここから始めるのが良いでしょう。

public static MvcHtmlString SwitchFor<TModel>(
   this HtmlHelper<TModel> helper, Expression<Func<TModel, 
           Object>> expression, Boolean wrap)
   {
        return wrap
            ? MvcHtmlString.Create(String.Format("<div class='helloworld'>{0}</div>", 
              helper.TextAreaFor(expression))) : helper.TextAreaFor(expression);
   }

適切なものを渡す

ExpressionTextBoxFor拡張機能に渡す必要があります。m =>のメソッド シグネチャはFuncで、TModel (m) を関数に渡し、オブジェクトを返します。

やりたいことをやって、デフォルトの実装を返す

何でも入れられます。ラップが false に設定されている場合、式を渡して元のメソッド呼び出しを返すだけであることがわかります。

電話をかける

あとは、最初に意図したとおりに電話をかけるだけです。

@(Html.SwitchFor(m => m.Data, true))

ヘルパーにする

これは私が最初に予想したよりも少しトリッキーですが、選択したcshtmlファイルのApp_Codeフォルダーに次のコードを追加するだけで実行できます。ヘルパー関数ではGenericsを使用できないため、 @function { }ブロックで正しいシグネチャを持つ実際の関数を作成する必要があります。

@using System.Linq.Expressions
@using System.Web.Mvc;
@using System.Web.Mvc.Html;
@functions
{
    public static HelperResult SwitchFor<TModel, Object>(HtmlHelper<TModel> html, Expression<Func<TModel, Object>> func, Boolean wrap)
    {
        var data = html.TextAreaFor(func);
        return WrapItUp(data);
    }
}
@helper WrapItUp(MvcHtmlString data)
{
    <div class="helloworld">
        @(data)
    </div>
}

電話をかける、まあほとんど

モデルに入力された HtmlHelper インスタンスを渡す必要があります。

@(Html.SwitchFor(Html, m => m.Data, true))

ところで、これはスゴイ!複数列フォームをより自然な方法でレイアウトするのに役立ちます。自分では思いつかなかった解決策なので、あなたの挑戦に出会えてよかったです。

グッドラック N 楽しんでください!

于 2014-05-18T07:41:31.703 に答える