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
.
归档时间: |
|
查看次数: |
13597 次 |
最近记录: |