MVC 3部分视图以及我需要发送给它的内容?

时间:2012-03-19 23:00:39

标签: asp.net-mvc-3

我想知道几种形式和部分形式的变化。提交在父页面上,我改变了我传递给局部视图的内容。我有一个父视图与一个相关的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

1 个答案:

答案 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我发布了一段时间以获取示例代码。然后,您可以在局部视图中使用它。