【问题标题】:Best way to cascade editor templates in asp.net mvc在 asp.net mvc 中级联编辑器模板的最佳方法
【发布时间】:2014-09-22 15:33:21
【问题描述】:

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

    <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 =&gt; x.Other),其中模板包含所有样板标记,并在正确的位置调用 EditorForLabelForValidationMessageFor

EditorFor 需要像往常一样根据属性类型选择正确的模板。

【问题讨论】:

  • @Html.EditorForModel()@Html.EditorFor(x =&gt; x) 有没有试过这个?

标签: c# asp.net-mvc templates


【解决方案1】:

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

Views\Shared\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 为您提供了一个提示:如果您传递一个空字符串,它会为您放入正确的字符串。

冲洗并重复所有其他类型。如需更深入的概述,请参阅我的帖子 Display Templates and Editor Templates for Fun and Profit

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 2023-03-13
    • 1970-01-01
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多