2

一般的に使用されるコードをヘルパー拡張機能にリファクタリングしようとしていますが、主にジェネリックやラムダ式などを完全に把握していないため、構文にこだわっています.

これを自分のビューに入れ、モデルのフィールド (FirstName など) を使用して、他の Razor 拡張機能を利用する HTML を生成できるようにしたいと考えています。

@MyHelpers.BootstrapFormItem(m => m.FirstName)

現時点で私は持っています:

@using System.Web.Mvc;
@using System.Web.Mvc.Html;
@using System.Linq;
@using System.Linq.Expressions;

@helper BootstrapFormitem(XXXXXXXXX) 
{
         <div class="control-group">
            @Html.LabelFor(XXXXXXX)
            <div class="controls">
               @Html.DisplayFor(XXXXX)
               @Html.ValidationMessageFor(XXXX)
            </div>
         </div>
}

質問:

  1. これは正しいアプローチですか?このメソッドを任意のビューモデル フィールドで使用できるようにしたいと考えています。
  2. 適切な名前空間を含めましたか? これは app_code フォルダーに入ります
  3. XXXXXX には何が入りますか?
4

1 に答える 1

2

このクラスは必要なことを行います。私はこれらを常に使用しています。

using System;
using System.Linq.Expressions;
using System.Text;
using System.Web.Mvc;
using System.Web.Mvc.Html;

public static class HtmlHelpers
{
    public static MvcHtmlString BootstrapFormItem<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression)
    {
        StringBuilder html = new StringBuilder("<div class=\"control-group\">");
        html.AppendLine(helper.LabelFor(expression).ToString());
        html.AppendLine("<div class=\"controls\">");
        html.AppendLine(helper.DisplayFor(expression).ToString());
        html.AppendLine(helper.ValidationMessageFor(expression).ToString());
        html.AppendLine("</div>");
        html.AppendLine("</div>");
        return MvcHtmlString.Create(html.ToString());
    }
}

これは静的クラスであり、拡張メソッドでもあることに注意してください。最初の入力パラメーターには「this」というプレフィックスが付いています。これは、タイプ の任意のオブジェクトを拡張する (Intellisense で「.」を入力すると表示される) ことを意味しますHtmlHelper<TModel>。通常、このクラスはUtilitiesフォルダーに配置します。名前空間もよく使用し、web.configから参照します。

質問に答えるために編集:

使用法は次のとおりです。Intellisense にも対応しています。

@model MyClass

@Html.BootstrapFormItem(x => x.Name)

これは出力です:

<div class="control-group">
    <label for="Name">Name</label>
    <div class="controls">
        naspinski
        <span class="field-validation-valid" data-valmsg-for="Name" data-valmsg-replace="true"/>
    </div>
</div>
于 2012-07-24T16:22:27.733 に答える