4im*_*ble 5 c# asp.net-mvc binding editorfor asp.net-mvc-3
我有一个EditorFor:
<%: Html.EditorFor(model => model.Client, "ClientTemplate", new { editing = false })%>
Run Code Online (Sandbox Code Playgroud)
这将绑定到视图正常(如预期)但在模型发布时不会绑定绑定.这是因为表单ID没有以"客户端"作为前缀.
通常在这种情况下我只是传入模型,然后将输入绑定到模板中的model.Client.PropertyName,但在这种情况下这不是一个选项,因为模板用于两个不同的视图模型(有客户端).
有关正确绑定的任何建议吗?
非常感谢,Kohan.
这似乎是我的一个误解,我现在明白这个问题是fluentHtml在EditorFor Templates中不起作用.(同样适用于此修复,因为事实证明不需要,因为如果我用正常的mvc html助手替换fluentHtml,EditorFor会自动为我添加前缀)
Jul*_*ubé 10
尝试类似的东西:
<% Html.BeginHtmlFieldPrefixScope("Client") {
Html.EditorFor(model => model.Client, "ClientTemplate", new { editing = false });
<% } %>
Run Code Online (Sandbox Code Playgroud)
使用EditorFor,LabelFor等制作的每个字段都将作为前缀.
编辑:这是我正在使用的扩展方法,抱歉!
public static IDisposable BeginHtmlFieldPrefixScope(this HtmlHelper html, string htmlFieldPrefix)
{
return new HtmlFieldPrefixScope(html.ViewData.TemplateInfo, htmlFieldPrefix);
}
Run Code Online (Sandbox Code Playgroud)
......和班级......
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;
}
}
Run Code Online (Sandbox Code Playgroud)
请参阅下面的评论中Kohan提到的链接.
小智 5
剪切和粘贴在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;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
在Razor(.cshtml)文件中,我添加了以下内容:
@using incMvcSite.Classes
@using(Html.BeginHtmlFieldPrefixScope("Permission")) {
<fieldset>
<legend>Permission</legend>
// The Html.EditorFor's would go here...
</fieldset>
}
Run Code Online (Sandbox Code Playgroud)
注意使用将扩展类带入范围.这允许第二个使用线工作.
现在的问题是,在回发时,对象不会更新.在我的控制器中,我使用第二个参数来指定我的前缀:
TryUpdateModel(modelUser.Permission, "Permission");
Run Code Online (Sandbox Code Playgroud)
这为HTML中的所有字段添加了前缀,TryUpdateModel使用前缀控件名称加载了对象.现在,您可以正确命名嵌入式编辑列表的控件,以及具有相同属性名称的模型的部分视图.