在EditorTemplate中渲染字段名称(通过EditorFor()呈现)

Jon*_*han 23 asp.net-mvc partial-views editorfor asp.net-mvc-2

我目前正在为ASP.NET MVC中的网站构建Admin后端.

在ASP.NET MVC应用程序中,我开始使用'EditorFor'辅助方法,如下所示:

<div id="content-edit" class="data-form">
    <p>
        <%= Html.LabelFor(c => c.Title) %>
        <%= Html.TextBoxFor(c => c.Title)%>
    </p>
    <p>
        <%= Html.LabelFor(c => c.Biography) %>
        <%= Html.EditorFor(c => c. Biography)%>
    </p>
</div>
Run Code Online (Sandbox Code Playgroud)

在模型中,"传记"字段已经用以下内容进行了装饰:[UIHelper("Html")].

我有一个'Html'局部视图(在Views/Shared/EditorTemplates下):

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<System.XML.Linq.XElement>" %>

<textarea class="html">
    <%= Model.ToString() %>
</textarea>
Run Code Online (Sandbox Code Playgroud)

现在我想将'textarea'的'ID'属性设置为字段的名称,如下所示:

<textarea id="Biography" class="html">
    ...
</textarea>
Run Code Online (Sandbox Code Playgroud)

但是我无法通过当前的设置看到这样做的方法.

我能想到的只是创建一个'Html'ViewModel,它包含'Value'属性和'ControlID'属性.

但是如果我基于这个视图,而不是'System.XML.Linq.XElement',它将不再与'EditorFor'辅助方法兼容,我必须手动完成所有操作.

有没有人有类似的问题呢?

Jus*_*ant 37

您应该能够从视图的ViewData.TemplateInfo.HtmlFieldPrefix属性中提取所需的ID.像这样:

<%@ Control Language="C#"
      Inherits="System.Web.Mvc.ViewUserControl<System.XML.Linq.XElement>" %>
<textarea id="<%= ViewData.TemplateInfo.HtmlFieldPrefix %>" class="html">
    <%= Model.ToString() %>
</textarea>
Run Code Online (Sandbox Code Playgroud)

为了说明其工作原理,这里是TemplateHelpers.cs(MVC2 Preview 1源代码)中的位置,其中为编辑器模板控件初始化了ViewData:

ViewDataDictionary viewData = new ViewDataDictionary(html.ViewDataContainer.ViewData) {
    Model = modelValue,
    TemplateInfo = new TemplateInfo {
        FormattedModelValue = formattedModelValue,
        ModelType = modelType,
        HtmlFieldPrefix = html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(expression),
        IsNullableValueType = (underlyingNullableType != null),
    }
};
Run Code Online (Sandbox Code Playgroud)

在上面的调用中,"expression"被初始化(进一步向上调用堆栈),其中包含正在编辑的属性的名称.

顺便说一句,下面的@Sperling抓住了我最初错过的一个细节:如果你正在使用(或者可能使用)非默认值HtmlHelper.IdAttributeDotReplacement,那么你将需要用HtmlPrefix属性替换属性中的点HtmlHelper.IdAttributeDotReplacement.

  • 在嵌套集合模型的情况下,这不是有效的解决方案.在那种情况下,````HtmlFieldPrefix```返回```collectionModel [index].{PropertyName}```但是默认情况下MVC以```collectionModel_ {index} __ {PropertyName}```的格式创建id.所以使用```ViewData.TemplateInfo.GetFullHtmlFieldId(string.Empty)```而不是```HtmlFieldPrefix``是安全的. (3认同)