在asp.net mvc中级联编辑器模板的最佳方法

时间:2014-09-22 15:33:22

标签: c# asp.net-mvc templates

给定一个看起来像这样的模板?

    <div class="form-group">
        <label class="control-label col-md-6">@Html.LabelFor(_ => _.A)</label>
        <div class="col-md-6">
            @Html.EditorFor(_ => _.A)
            @Html.ValidationMessageFor(_ => _.A, null, new { @class = "help-block" })
        </div>
    </div>
    <div class="form-group">
        <label class="control-label col-md-6">@Html.LabelFor(_ => _.B)</label>
        <div class="col-md-6">
            @Html.EditorFor(_ => _.B)
            @Html.ValidationMessageFor(_ => _.B, null, new { @class = "help-block" })
        </div>
    </div>
   (and repeat for every field)

如何正确参数化。编辑器模板似乎没有好好结合。

换句话说,我认为需要的是一个将lambda作为模型参数的模板?

TemplateFor(x => x.Other)其中模板包含所有样板标记,并在正确的位置调用EditorForLabelForValidationMessageFor

EditorFor需要根据属性的类型选择正确的模板,就像通常那样。

1 个答案:

答案 0 :(得分:1)

您可以将此全部内容放入编辑器模板中。例如,您可以为String

创建编辑器模板

<强>视图\共享\ EditorTemplates \ String.cshtml

<div class="form-group">
    <label class="control-label col-md-6">@Html.Label("")</label>
    <div class="col-md-6">
        @Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue)
        @Html.ValidationMessage("", null, new { @class = "help-block" })
    </div>
</div>

然后,对于任何string属性,您只需在视图中添加以下内容:

@Html.EditorFor(m => m.SomeStringProperty)

注意,有关编辑器模板的两件事:

  1. 没有*For方法,而只是普通的HTML帮助程序。这使您可以回避需要携带初始表达式的问题。
  2. 然而,常规方法要求您将属性名称指定为字符串,但幸运的是,Razor为您提供了一个输出:如果您传递一个空字符串,它会为您输入正确的字符串。
  3. 冲洗并重复所有其他类型。有关更深入的概述,请参阅我的帖子Display Templates and Editor Templates for Fun and Profit