我有视图模型,它有另一个子模型来渲染局部视图(下图).
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属性值绑定元素值,但第二个实现需要我为每个页面创建一个多部分,我不喜欢.
到目前为止,我找不到与第一个实现一起工作的解决方案,是否有可能在第一次实现提交期间使初步信息模型值绑定.
我知道它有点晚了,但它可能对某人有所帮助
如果您有复杂的模型,您仍然可以使用以下方法将其传递给部分:
@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)
在您提交模型后,它将再次绑定.
希望有所帮助
您需要创建一个编辑器模板PreliminaryInformationViewModel
来替换局部视图,然后调用Html.EditorFor( m => m.PreliminaryInformation )
.参考此解决方案.创建模板应该像将部分视图移动到Views/Shared/EditorTemplates目录一样简单. Html.EditorFor(...)
将根据您作为模型传入的类型自动使用此模板(在本例中PreliminaryInformationViewModel
)
您可以将HtmlFieldPrefix添加到局部视图的顶部:
@{ ViewData.TemplateInfo.HtmlFieldPrefix = "Contact"; }
这与@cpoDesign描述的方法相同,但这意味着如果需要,可以在部分视图中保留前缀.