我想知道几种形式和部分形式的变化。提交在父页面上,我改变了我传递给局部视图的内容。我有一个父视图与一个相关的HomeViewModel(具有公共属性Name和公共Person Employee {get; set;}
1。)场景1:主视图具有以下内容
@model MasterDetailSample.Models.HomeViewModel
@using (Html.BeginForm()) {
<div>
@{Html.RenderPartial("_PersonView", @Model);}
</div>
<input type="submit" value="Save" />
}
在这种情况下,我传递给部分视图_PersonView整个HomeViewModel。在_PersonView局部视图中,我必须通过@ model.Employee.Name引用HomeViewModel的属性,即Person对象(在这种情况下,提交在父窗体上(不在局部视图中))
当我在控制器上的表单(POST)上按提交时,我必须通过以下模型访问Employee“Name”的属性.Employee.Name
这似乎工作但是请注意以下变体场景2(我只传递给Employee对象的部分)
2。)场景2 在这种情况下,我只想将Employee对象发送到局部视图。再次,开始表单和提交在父表单上。
所以我从父母表格
@{Html.RenderPartial("_MasterView", @Model.Employee);}
所以在局部视图中我通过@ Employee.Name引用Person对象的Name属性现在当我在控制器中提交表单时,自动模型绑定器中没有Employee对象。我可以通过formcollection访问属性,但不能从模型参数
访问即
[HttpPost]
public ActionResult Index(ModelViewModel model) {
**//model.Employee is null!**
return View();
}
为什么? (是model.Employee null)我希望我的局部视图只接受Person类型的对象,但是从父页面提交后,Employee属性为null。在部分视图中,我在@model行上使用以下内容
@model MasterDetailSample.Models.Person
我希望部分只需要一个Person对象发送给它,但我想在主窗体上提交。如果我这样做,我可以在几种情况下重新使用局部视图,但是如果我必须发送HomeViewModel,我已经明显限制了我如何使用这个局部视图。所以,再次,我只想使用Person作为部分视图的模型,但我需要能够在从父视图提交时访问属性。
可以这样做吗?如果是的话怎么样?
THX
答案 0 :(得分:1)
您有几个选择:
1)我推荐一个 - &gt;不要使用部分视图,而是使用EditorFor并为Person创建编辑器模板。对于部分视图,上下文是您传递到视图中的任何模型,这就是您的示例(1)工作和(2)不工作的原因。但是,使用编辑器模板时,将使用html帮助程序考虑父上下文,并生成正确的输入名称。 Have a look at Darin Dimitrov's answer提出了类似的问题。
2)按原样使用你的第二个例子,但是将post动作更改为如下所示:
[HttpPost]
public ActionResult Index(ModelViewModel model) {
TryUpdateModel(model.Employee);
**//model.Employee should now be filled!**
return View();
}
3)使用接受输入前缀的自定义html助手,请参阅this answer我发布了一段时间以获取示例代码。然后,您可以在局部视图中使用它。