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

时间:2009-09-27 06:17:26

标签: asp.net-mvc asp.net-mvc-2 partial-views editorfor

我目前正在为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>

在模型中,“传记”字段已用以下内容修饰:[UIHelper(“Html”)]。

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

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

<textarea class="html">
    <%= Model.ToString() %>
</textarea>

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

<textarea id="Biography" class="html">
    ...
</textarea>

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

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

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

有没有人遇到过类似的问题?

3 个答案:

答案 0 :(得分: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>

为了说明其工作原理,这里是TemplateHelpers.cs(MVC2预览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),
    }
};

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

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

答案 1 :(得分:4)

一直用它来生成id(带模型前缀)。如果,请跳过.Replace()部分 你想要名字属性。

<%=Html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(String.Empty).Replace(".", HtmlHelper.IdAttributeDotReplacement) %>

答案 2 :(得分:0)

在我们的案例中,我们必须将Html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldNameExpressionHelper.GetExpressionText

一起使用 在剃须刀中使用的是这样的:

           // hiddenFor was caching the value of this html input, and the value alone, nothing else on the page!
            Expression<Func<Web.ViewModels.ApiSettingsViewModel, int>> expression = (m => m.OrgApiLoginCredentials[i].OrgApiLoginId); 
        }
        <input type="hidden" value="@Model.OrgApiLoginCredentials[i].OrgApiLoginId" name="@Html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(ExpressionHelper.GetExpressionText(expression))" class="data-org-api-login-id"/>