我有一个EditorFor:
<%: Html.EditorFor(model => model.Client, "ClientTemplate", new { editing = false })%>这将绑定到视图精细(如预期),但不会绑定回绑定时,模型被发布。这是由于表单id没有以“Client”作为前缀。
通常,在这种情况下,我只是传入模型,然后将输入绑定到模板中的model.Client.PropertyName,但在这种情况下,这不是一个选项,因为模板在两个不同的视图模型上使用(其中有客户端)。
有什么建议能让这件事正确地绑定起来吗?
非常感谢,科汉。
附录
这似乎是我的误解,正如我现在所理解的,问题是fluentHtml在EditorFor模板中不能工作。(这个修补程序也是这样,因为如果我用普通的mvc帮助程序替换了fluentHtml,那么它就不需要了,因为fluentHtml会自动为我加上前缀)
发布于 2011-01-05 16:51:22
试一试如下:
<% Html.BeginHtmlFieldPrefixScope("Client") {
Html.EditorFor(model => model.Client, "ClientTemplate", new { editing = false });
<% } %>您使用EditorFor、LabelFor和其他类似工具创建的每个字段都将加上前缀。
编辑:这是我使用的扩展方法,对不起!
public static IDisposable BeginHtmlFieldPrefixScope(this HtmlHelper html, string htmlFieldPrefix)
{
return new HtmlFieldPrefixScope(html.ViewData.TemplateInfo, htmlFieldPrefix);
}...and全班..。
private class HtmlFieldPrefixScope : IDisposable
{
private readonly TemplateInfo templateInfo;
private readonly string previousHtmlFieldPrefix;
public HtmlFieldPrefixScope(TemplateInfo templateInfo, string htmlFieldPrefix)
{
this.templateInfo = templateInfo;
previousHtmlFieldPrefix = templateInfo.HtmlFieldPrefix;
templateInfo.HtmlFieldPrefix = htmlFieldPrefix;
}
public void Dispose()
{
templateInfo.HtmlFieldPrefix = previousHtmlFieldPrefix;
}
}参见Kohan在下面的评论中提到的链接。
发布于 2011-07-30 21:23:39
MVC3名称冲突
在MVC3中不起作用的剪切和粘贴。要使扩展名正常工作,我必须创建一个类文件:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace incMvcSite.Classes {
public static class HtmlPrefixScopeExtensions {
public static IDisposable BeginHtmlFieldPrefixScope(this HtmlHelper html, string htmlFieldPrefix) {
return new HtmlFieldPrefixScope(html.ViewData.TemplateInfo, htmlFieldPrefix);
}
private class HtmlFieldPrefixScope : IDisposable {
private readonly TemplateInfo templateInfo;
private readonly string previousHtmlFieldPrefix;
public HtmlFieldPrefixScope(TemplateInfo templateInfo, string htmlFieldPrefix) {
this.templateInfo = templateInfo;
previousHtmlFieldPrefix = templateInfo.HtmlFieldPrefix;
templateInfo.HtmlFieldPrefix = htmlFieldPrefix;
}
public void Dispose() {
templateInfo.HtmlFieldPrefix = previousHtmlFieldPrefix;
}
}
}
}在Razor (.cshtml)文件中,我添加了以下内容:
@using incMvcSite.Classes
@using(Html.BeginHtmlFieldPrefixScope("Permission")) {
<fieldset>
<legend>Permission</legend>
// The Html.EditorFor's would go here...
</fieldset>
}注意将我的扩展类引入范围的用法。这允许第二次使用行工作。
现在的问题是,当回发时,对象不会被更新。在控制器中,我使用了第二个参数来指定前缀:
TryUpdateModel(modelUser.Permission, "Permission");这将前缀添加到HTML中的所有字段中,TryUpdateModel加载了带有前缀控件名称的对象。现在,您可以为嵌入式编辑列表和具有相同属性名称的模型的部分视图正确命名空间控件。
https://stackoverflow.com/questions/4606686
复制相似问题