首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >强迫EditorFor在视图中的输入项前缀为类名吗?

强迫EditorFor在视图中的输入项前缀为类名吗?
EN

Stack Overflow用户
提问于 2011-01-05 16:43:26
回答 2查看 6.6K关注 0票数 7

我有一个EditorFor:

代码语言:javascript
复制
<%: Html.EditorFor(model => model.Client, "ClientTemplate", new { editing = false })%>

这将绑定到视图精细(如预期),但不会绑定回绑定时,模型被发布。这是由于表单id没有以“Client”作为前缀。

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

有什么建议能让这件事正确地绑定起来吗?

非常感谢,科汉。

附录

这似乎是我的误解,正如我现在所理解的,问题是fluentHtml在EditorFor模板中不能工作。(这个修补程序也是这样,因为如果我用普通的mvc帮助程序替换了fluentHtml,那么它就不需要了,因为fluentHtml会自动为我加上前缀)

EN

回答 2

Stack Overflow用户

发布于 2011-01-05 16:51:22

试一试如下:

代码语言:javascript
复制
<% Html.BeginHtmlFieldPrefixScope("Client") {
  Html.EditorFor(model => model.Client, "ClientTemplate", new { editing = false });
<% } %>

您使用EditorFor、LabelFor和其他类似工具创建的每个字段都将加上前缀。

编辑:这是我使用的扩展方法,对不起!

代码语言:javascript
复制
public static IDisposable BeginHtmlFieldPrefixScope(this HtmlHelper html, string htmlFieldPrefix)
{
  return new HtmlFieldPrefixScope(html.ViewData.TemplateInfo, htmlFieldPrefix);
}

...and全班..。

代码语言:javascript
复制
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在下面的评论中提到的链接。

票数 11
EN

Stack Overflow用户

发布于 2011-07-30 21:23:39

MVC3名称冲突

在MVC3中不起作用的剪切和粘贴。要使扩展名正常工作,我必须创建一个类文件:

代码语言:javascript
复制
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)文件中,我添加了以下内容:

代码语言:javascript
复制
@using incMvcSite.Classes
@using(Html.BeginHtmlFieldPrefixScope("Permission")) {
    <fieldset>
        <legend>Permission</legend>

        // The Html.EditorFor's would go here...
    </fieldset>
}

注意将我的扩展类引入范围的用法。这允许第二次使用行工作。

现在的问题是,当回发时,对象不会被更新。在控制器中,我使用了第二个参数来指定前缀:

代码语言:javascript
复制
TryUpdateModel(modelUser.Permission, "Permission");

这将前缀添加到HTML中的所有字段中,TryUpdateModel加载了带有前缀控件名称的对象。现在,您可以为嵌入式编辑列表和具有相同属性名称的模型的部分视图正确命名空间控件。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4606686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档