首页 文章

ASP.NET MVC 字段 id 生成,由 AJAX 加载的部分视图创建 non-unique 名称

提问于
浏览
8

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

每当我通过 AJAX 将局部视图加载到当前页面(e.g. 进入模态对话框)时,如果此局部视图的模型包含的字段与原始视图模型中的其他字段相同,则会遇到问题(因为 ASP.NET MVC 生成相同的 ID)。

有没有办法告诉局部视图使用特定前缀呈现其字段(以这种方式,后来的模型绑定理解那些前缀名称)?

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

问题的最佳实践解决方案?

2 回答

  • 3

    这就是我要做的事情:

    将其保存为项目中的 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 (Html.BeginPrefixScope("Country"))
    {
        <div class="content">
            <div>
                @Html.EditorFor(model => model.Name)
            </div>
            <div>
                @Html.EditorFor(model => model.Population)
            </div>
        </div>
    }
    

    最后但同样重要的是,不要忘记在匹配 HtmlPrefixScopeExtensions.cs 位置的视图中包含 using 语句,例如:

    @using YourNamespace.Helpers
    

    或者将正确的命名空间添加到 Views/Web.config(这是推荐的选项,你只需要执行一次!):

    <namespaces>
        <add namespace="System.Web.Helpers" />
        ...... 
       <add namespace="YourNamespace.Helpers" /> 
    </namespaces>
    

    现在:字段名称将为例如“Country.Name”

    然后,您必须在帖子 e.g 中具有匹配的名称:

    [HttpPost]
    public ActionResult SaveCountry(Country country)
    {
        // save logic
        return View();
    }
    

    致谢:我剥夺了史蒂夫桑德森精彩的 BeginCollectionItem 课程

  • 0

    创建自己的 Helper 方法来传递带 ID 的前缀,这不是一个大问题。

相关问题