C# NET MVC字段id生成,AJAX加载的局部视图创建非唯一名称

C# NET MVC字段id生成,AJAX加载的局部视图创建非唯一名称,c#,asp.net-mvc,asp.net-mvc-4,C#,Asp.net Mvc,Asp.net Mvc 4,我们使用ASP.NETMVC的HTML帮助程序生成表单,因此表单字段的名称也由这些HTML帮助程序生成 每当我通过AJAX将部分视图加载到当前页面(例如,加载到模式对话框中)时,如果该部分视图的模型包含一个与原始视图模型中的其他字段同名的字段(因为ASP.NET MVC生成相同的ID),我就会遇到问题 是否有任何方法可以告诉局部视图使用特定前缀呈现其字段(这样,以后的模型绑定就可以理解这些前缀名称) 目前,我们将部分视图模型中的字段重命名为“PartialDateOfBirth”,以不干扰原始页

我们使用ASP.NETMVC的HTML帮助程序生成表单,因此表单字段的名称也由这些HTML帮助程序生成

每当我通过AJAX将部分视图加载到当前页面(例如,加载到模式对话框中)时,如果该部分视图的模型包含一个与原始视图模型中的其他字段同名的字段(因为ASP.NET MVC生成相同的ID),我就会遇到问题

是否有任何方法可以告诉局部视图使用特定前缀呈现其字段(这样,以后的模型绑定就可以理解这些前缀名称)

目前,我们将部分视图模型中的字段重命名为“PartialDateOfBirth”,以不干扰原始页面的模型“DateOfBirth”,但如果您通过AJAX多次将同一部分视图加载到页面中,则这很糟糕,也不起作用


有没有解决这个问题的最佳实践方案?

创建自己的助手方法来传递带有ID的前缀,这不是一个大任务

下面是我要做的:

在项目中将其另存为HtmlPrefixScopeExtensions.cs

public static class HtmlPrefixScopeExtensions
{
    public static IDisposable BeginPrefixScope(this HtmlHelper html, string htmlFieldPrefix)
    {
        return new HtmlFieldPrefixScope(html.ViewData.TemplateInfo, htmlFieldPrefix);
    }

    internal class HtmlFieldPrefixScope : IDisposable
    {
        internal readonly TemplateInfo TemplateInfo;
        internal readonly string PreviousHtmlFieldPrefix;

        public HtmlFieldPrefixScope(TemplateInfo templateInfo, string htmlFieldPrefix)
        {
            TemplateInfo = templateInfo;
            PreviousHtmlFieldPrefix = TemplateInfo.HtmlFieldPrefix;
            TemplateInfo.HtmlFieldPrefix = htmlFieldPrefix;
        }

        public void Dispose()
        {
            TemplateInfo.HtmlFieldPrefix = PreviousHtmlFieldPrefix;
        }
    }
}
然后从以下位置更改视图,例如:

<div class="content">
    <div>
        @Html.EditorFor(model => model.Name)
    </div>
    <div>
        @Html.EditorFor(model => model.Population)
    </div>
</div>
@using YourNamespace.Helpers
或者将正确的名称空间添加到Views/Web.config(这是目前推荐的选项,您只需执行一次!):


信贷:我剥离了Steve Sanderson精彩的BeginCollectionItem类

ModelBinder查找名称属性,而不是id。您应该更好地解释这个问题。您是否正在发布多个表单?张贴一些代码以及!你说得对,我在帖子中用“姓名”替换了所有的“ID”。我触发了一个AJAX请求,它返回一个新的局部视图,该视图基于一个模型,该模型的属性与原始视图模型中的一些其他属性同名。是的,你说的和问题中的一样!但是,你用这些数据做什么?你好吗?如果您正在发布列表,则名称是一个问题。您的控制器期望什么?如果你不能提供任何代码,我真的不能给你任何提示来解决这个问题!我想答案可以在这里找到:@KrisMcGinnes:只有当你仍然在相同的请求中时,这才有效。用AJAX加载页面,我需要通过请求参数定义前缀?!用我们自己的实现替换所有ASP.NET MVC HTML帮助程序有点大。除了更新或重新发明车轮等“小”警告之外。我不认为这是解决我们问题的企业解决方案。谢谢你的回答。我自己做的,你只需要创建你需要的助手,在旁边你可以使用原来的助手,但是用你的方法把它封装起来,这会改变ID有前缀。你打开了你的包装器吗?你考虑开源吗?
@using YourNamespace.Helpers
<namespaces>
    <add namespace="System.Web.Helpers" />
    ...... 
   <add namespace="YourNamespace.Helpers" /> 
</namespaces>
[HttpPost]
public ActionResult SaveCountry(Country country)
{
    // save logic
    return View();
}