7

我有一个编辑器:

<%: Html.EditorFor(model => model.Client, "ClientTemplate", new { editing = false })%>

这将很好地绑定到视图(如预期的那样),但在发布模型时不会绑定绑定。这是因为表单 ID 没有以“客户”为前缀。

通常在这种情况下,我只是传入模型,然后将输入绑定到模板中的 model.Client.PropertyName 但在这种情况下这不是一个选项,因为模板用于两个不同的视图模型(具有客户端)。

关于让它正确绑定的任何建议?

非常感谢,科汉。


附录

这似乎是我的一个误解,我现在理解的问题是 fluentHtml 在 EditorFor 模板中不起作用。(此修复也是如此,事实证明不需要,因为如果我用普通的 mvc html 帮助器替换 fluentHtml,EditorFor 会自动为我添加前缀)

4

2 回答 2

11

尝试类似:

<% 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);
}

……还有班级……

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-01-05T16:51:22.037 回答
6

MVC3 HTML 名称冲突

在 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 加载了带有前缀控件名称的对象。现在,您可以为嵌入式编辑列表和具有相同属性名称的模型的部分视图正确命名控件。

于 2011-07-30T21:23:39.477 回答