Asp.net mvc 4 MVC4-提交期间的部分视图模型绑定

Asp.net mvc 4 MVC4-提交期间的部分视图模型绑定,asp.net-mvc-4,Asp.net Mvc 4,我有一个视图模型,它有另一个子模型来渲染局部视图(如下) 此初步信息ViewModel视图模型也用作另一视图模型中的子模型,因为此初步信息可以在不同页面上更新 因此,我创建了这个初步信息作为一个单独的部分,并包含在其他页面中 @{Html.RenderPartial("_PreliminaryInformation", Model.PreliminaryInformation);} 内部部分 @model Web.Models.Preliminary.PreliminaryInformatio

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

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

因此,我创建了这个初步信息作为一个单独的部分,并包含在其他页面中

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

@model Web.Models.Preliminary.PreliminaryInformationViewModel
<div>
    @Html.TextBoxFor(x => x.DateOfService })
</div>
@model.Web.Models.premimary.premimaryinformationviewmodel
@Html.TextBoxFor(x=>x.DateOfService})
但问题是在提交过程中,由于HTML名称属性始终呈现为空,因此此初步模型始终为空

但当我将父模型传递给partial时,如下所示

@model Web.Models.Exam.ExamResultsFormViewModel
<div>
    @Html.TextBoxFor(x => x.PreliminaryInformation.DateOfService })
</div>
@model Web.Models.Exam.ExamResultsFormViewModel
@Html.TextBoxFor(x=>x.PreliminaryInformation.DateOfService})
现在HTML元素生成为

<input type = 'text' name='PreliminaryInformation.DateOfService.DateOfService' id='PreliminaryInformation.DateOfService'>

并在提交过程中正确绑定

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


到目前为止,我还没有找到一个解决方案来处理第一个实现,有没有办法在提交第一个实现时绑定初步信息模型值。

您需要为
PreliminaryInformationViewModel
创建一个编辑器模板来替换部分视图,然后使用
Html.EditorFor调用(m=>m.PreliminaryInformation)
.Reference。创建模板应该很简单,只需将局部视图移动到Views/Shared/EditorTemplates目录。
Html.EditorFor(…)
将根据您作为模型传入的类型自动使用此模板(在本例中,
PreliminaryInformationViewModel

快速提示:调用EditorFor方法时,可以将模板名称设置为Html.EditorFor方法的参数。或者,命名约定可以是您的朋友;只需确保编辑器模板文件名与模型属性类型的名称完全相同即可


i、 e.模型属性类型“CustomerViewModel”=>“CustomerViewModel.cshtml”编辑器模板。

我也遇到了这个问题。我将使用您的代码解释我的解决方案。我从以下内容开始:

@{
   Html.RenderPartial("_PreliminaryInformation", Model.PreliminaryInformation);
}
与http post对应的操作正在查找父模型。http post正在正确提交表单,但子部分中没有对父部分的引用。子部分中提交的值被忽略,相应的子属性保持为null

我创建了一个接口ipreliminarynfobable,其中包含子类型的定义,如下所示:

public interface IPreliminaryInfoCapable
{
    PreliminaryInformationViewModel PreliminaryInformation { get; set; }
}
@model IPreliminaryInfoCapable
...
@Html.LabelFor(m => m.PreliminaryInformation.ProviderName)
etc.
我让我的父模型实现此接口。然后,我的局部视图使用顶部的接口作为模型:

@model IPreliminaryInfoCapable
最后,我的父视图可以使用以下代码将其自身传递给子部分:

@{
    Html.RenderPartial("ChildPartial", Model);
}
然后子分部可以使用子对象,如下所示:

public interface IPreliminaryInfoCapable
{
    PreliminaryInformationViewModel PreliminaryInformation { get; set; }
}
@model IPreliminaryInfoCapable
...
@Html.LabelFor(m => m.PreliminaryInformation.ProviderName)
etc.

所有这些都会在http发布到相应操作时正确填充父模型。

请对您的部分页面进行以下更改。因此,它将随父模型一起提供

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

//Partial Page
@model Web.Models.Preliminary.PreliminaryInformationViewModel
@using (Html.BeginCollectionItem("PreliminaryInformation", item.RowId, true))
    {
<div>
@Html.TextBoxFor(x => x.DateOfService })
</div>

}
//父页面
@{Html.RenderPartial(“_PreliminaryInformation”,Model.PreliminaryInformation);}
//部分页
@模型Web.Models.Premimary.PremimaryInformationViewModel
@使用(Html.BeginCollectionItem(“PreliminaryInformation”,item.RowId,true))
{
@Html.TextBoxFor(x=>x.DateOfService})
}

我知道有点晚了,但这可能会对某人有所帮助

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

@Html.Partial("_YourPartialName", Model.Contact, new ViewDataDictionary()
{
    TemplateInfo = new TemplateInfo()
    {
        HtmlFieldPrefix = "Contact"
    }
})
我已经用属性“Contact”定义了模型。现在HtmlFieldPrefix要做的是为每个模型添加属性绑定“这样模型绑定器就可以找到父模型”

有一篇关于它的博文:

.NET核心2绑定

在.NETCore2和MVC中,上述答案将不起作用,属性不再可设置

无论如何,这个解决方案是非常相似的

 @{ Html.ViewData.TemplateInfo.HtmlFieldPrefix = "Contact"; }
 @await Html.PartialAsync("_YourPartialName", Model.Contact)
提交模型后,它将再次绑定


希望对您有所帮助

您可以将HtmlFieldPrefix添加到局部视图的顶部:

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

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

对于.net core 2和mvc,请使用如下方法:

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

好的,使用EditerFor解决了绑定问题,但它也替换了我在视图中应用的所有类和样式。“”将部分视图移动到Views\Shared\EditorTemplates,调用
Html.EditorFor(…)
应该根据您作为模型传递的类型自动为编辑器模板选择此视图感谢回复Moho。我能够在使用EditorFor提交期间渲染部分和元素值绑定,但使用EditorFor渲染会将一些编辑器类添加到div和元素中,并删除实际绑定的编辑器类放置在视图上是否有任何方法可以防止将这些编辑器类添加到部分中的元素。如果我有一个联系人对象列表,并希望将其绑定到模型,该怎么办?您需要使用上面的样式为每个循环换行我看不到循环应该放在什么合理的位置,请您建议?非常好,感谢您提供了这个绝妙的技巧!这为编辑器模板的所有功能提供了局部视图的灵活性。编辑器模板的整个概念有点夸张,因为它们只是调用局部视图的不同语法,添加了视图绑定到项目中特定目录的约束。使用回答:你可以两全其美。再次感谢!这对我帮助很大:D感谢我知道这可能是对原始答案的评论,但我没有代表。这对于在不同的地方使用局部视图非常有用&diff