4

私のモデル:

public class EmployeeModel
{
    [Required]
    [StringLength(50)]
    [Display(Name = "Employee Name")]
    public string EmpName { get; set; }

    [Required]
    [StringLength(150)]
    [Display(Name = "Email Id")]
    public string Email { get; set; }

    [Required]
    [Range(18, 150)]
    public int Age { get; set; }

}

私からしてみれば:

 @Html.MyEditFor(model=>model.EmpName)
 @Html.MyEditFor(model=>model.Email)
 @Html.MyEditFor(model=>model.Age)

私のカスタムヘルパー:

public static MvcHtmlString MyEditFor<TModel>(this HtmlHelper<TModel> html, Expression<Func<TModel, object>> expression)
    {
        var partial = html.Partial("Item", new LabelEditorValidation() { Label = html.LabelFor(expression), Editor = html.EditorFor(expression), Validation = html.ValidationMessageFor(expression) }).ToString();
        return MvcHtmlString.Create(partial);
    }

Item.cshtml-部分ビュー:

 @model MyClientCustomValidation.Models.LabelEditorValidation 
        <tr>
            <td class="editor-label" style="border: 0;">
                @Model.Label
            </td>
            <td class="editor-field" style="border: 0">
                @Model.Editor
                @Model.Validation
            </td>
        </tr>

LabelEditorValidation-Item.cshtmlのモデル:

      public class LabelEditorValidation
{
    public MvcHtmlString Validation { get; set; }
    public MvcHtmlString Label { get; set; }
    public MvcHtmlString Editor { get; set; }
}

例外があります

テンプレートは、フィールドアクセス、プロパティアクセス、単一次元配列インデックス、または単一パラメーターのカスタムインデクサー式でのみ使用できます。

オンライン:

    var partial = html.Partial("Item", new LabelEditorValidation() { Label = html.LabelFor(expression), Editor = html.EditorFor(expression), Validation = html.ValidationMessageFor(expression) }).ToString();

@Html.MyEditForが呼び出されたときに例外 が発生しmodel.Ageます。

 @Html.MyEditFor(model=>model.Age) 

ただし、とが呼び出された場合は@Html.MyEditFor発生しません。それは、とが文字列であるためですが、model.EmpNamemodel.Emailmodel.EmpNamemodel.Emailmodel.Ageint

4

2 に答える 2

10

Google検索ユーザーのHtml.XyzFor場合、このようなメソッドを呼び出さないでください

@Html.CheckBoxFor(model => model.Property***.MyMethod()***)

view models代わりに、指定されたプロパティにそれを適用するために使用しMyMethodます。

于 2013-04-29T18:51:55.737 に答える
7

ヘルパーをもう少し一般的にして、object引数を取り除くことができます。

public static MvcHtmlString MyEditFor<TModel, TProperty>(
    this HtmlHelper<TModel> html, 
    Expression<Func<TModel, TProperty>> expression
)
{
    var partial = html.Partial(
        "Item", 
        new LabelEditorValidation 
        { 
            Label = html.LabelFor(expression), 
            Editor = html.EditorFor(expression), 
            Validation = html.ValidationMessageFor(expression) 
        }
    ).ToString();
    return MvcHtmlString.Create(partial);
}

これで、不要なボクシングがなくなるため、表現が壊れることはありません。

于 2013-02-04T16:04:23.580 に答える