8

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

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

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

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

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

4

2 回答 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”

然后,您的帖子中必须有匹配的名称,例如:

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

致谢:我剥离了 Steve Sanderson 精彩的 BeginCollectionItem 类

于 2013-11-10T01:18:22.477 回答
0

创建您自己的 Helper 方法来传递带有 ID 的前缀,这不是一项大工作。

于 2013-09-18T19:51:30.350 回答