MVC4 - 提交期间的部分视图模型绑定

 qinsg688_377 发布于 2023-02-09 09:10

我有视图模型,它有另一个子模型来渲染局部视图(下图).

public class ExamResultsFormViewModel
{
    public PreliminaryInformationViewModel PreliminaryInformation { get; set; }

    public string MemberID { get; set; }

    public string MemberName { get; set; }

    public int PatientID { get; set; }

    public string ConfirmationID { get; set; }

    public bool IsEditable { get; set; }

    #region Select Lists
    public SelectList ProviderOptions { get; set; }
    #endregion
}

public class PreliminaryInformationViewModel
{
    public string ProviderName { get; set; }

    public string ProviderID { get; set; }

    public string ServiceLocation { get; set; }
}

此PreliminaryInformationViewModel视图模型还用作另一个视图模型中的子模型,因为此初步信息可以在不同页面上更新.

因此,我将此初步信息创建为单独的部分,并包含在其他页面中.

@{Html.RenderPartial("_PreliminaryInformation", Model.PreliminaryInformation);}

里面偏

@model Web.Models.Preliminary.PreliminaryInformationViewModel
@Html.TextBoxFor(x => x.DateOfService })

但问题是在提交期间,由于HTML名称属性始终呈现为原因,因此初步模型始终为null

但是当我将父模型传递给部分时,如下所示.

@model Web.Models.Exam.ExamResultsFormViewModel
@Html.TextBoxFor(x => x.PreliminaryInformation.DateOfService })

现在HTML元素生成为


并且它在提交期间正确绑定.

我理解MVC基于name属性值绑定元素值,但第二个实现需要我为每个页面创建一个多部分,我不喜欢.

到目前为止,我找不到与第一个实现一起工作的解决方案,是否有可能在第一次实现提交期间使初步信息模型值绑定.

3 个回答
  • 我知道它有点晚了,但它可能对某人有所帮助

    如果您有复杂的模型,您仍然可以使用以下方法将其传递给部分:

    @Html.Partial("_YourPartialName", Model.Contact, new ViewDataDictionary()
    {
        TemplateInfo = new TemplateInfo()
        {
            HtmlFieldPrefix = "Contact"
        }
    })
    

    我在哪里定义了具有"联系"属性的模型.现在HtmlFieldPrefix做的是为每个模型添加属性绑定"因此模型绑定器可以找到父模型"

    有一篇关于它的博客文章:http://www.cpodesign.com/blog/bind-partial-view-model-binding-during-submit/

    .NET Core 2绑定

    在.NET Core 2和MVC中,上面的答案不起作用,该属性不再可设置.

    该解决方案如何非常相似.

     @{ Html.ViewData.TemplateInfo.HtmlFieldPrefix = "Contact"; }
     @await Html.PartialAsync("_YourPartialName", Model.Contact)
    

    在您提交模型后,它将再次绑定.

    希望有所帮助

    2023-02-09 09:15 回答
  • 您需要创建一个编辑器模板PreliminaryInformationViewModel来替换局部视图,然后调用Html.EditorFor( m => m.PreliminaryInformation ).参考此解决方案.创建模板应该像将部分视图移动到Views/Shared/EditorTemplates目录一样简单. Html.EditorFor(...)将根据您作为模型传入的类型自动使用此模板(在本例中PreliminaryInformationViewModel)

    2023-02-09 09:15 回答
  • 您可以将HtmlFieldPrefix添加到局部视图的顶部:

    @{
        ViewData.TemplateInfo.HtmlFieldPrefix = "Contact";
    }
    

    这与@cpoDesign描述的方法相同,但这意味着如果需要,可以在部分视图中保留前缀.

    2023-02-09 09:17 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有