我目前正在为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'辅助方法兼容,我必须手动完成所有操作。
有没有人遇到过类似的问题?
答案 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.GetFullHtmlFieldName
与ExpressionHelper.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"/>