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

本文关键字:最佳 方式 编辑器 级联 asp net mvc | 更新日期: 2023-09-27 18:24:06

给定这样的模板?

    <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需要根据属性的类型选择正确的模板,就像通常一样。

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

您可以将这些都放在编辑器模板中。例如,您可以为String:创建一个编辑器模板

Views''Shared''EditorTemplates''String.cs.html

<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给了您一个out:如果您传递一个空字符串,它会为您放入正确的字符串

冲洗并重复所有其他类型。有关更深入的概述,请参阅我的文章,显示模板和编辑器模板的乐趣和利润。