【问题标题】:MVC 3 Partial View and what I need to send to it?MVC 3 Partial View 和我需要发送给它什么?
【发布时间】:2012-03-20 07:41:44
【问题描述】:

我想知道一些形式和部分形式的变体。提交在父页面上,我改变了传递给部分视图的内容。我有一个带有相关 HomeViewModel 的父视图(它具有公共属性 Name 和 public Person Employee {get;set;}

1.) 场景 1:主视图如下所示

@model MasterDetailSample.Models.HomeViewModel

@using (Html.BeginForm()) {
    <div>
        @{Html.RenderPartial("_PersonView", @Model);}
    </div>
    <input type="submit" value="Save" />        
}

在这种情况下,我将整个 HomeViewModel 传递给局部视图 _PersonView。在 _PersonView 局部视图中,我必须通过 @model.Employee.Name 引用 HomeViewModel 的属性,即 Person 对象(在这种情况下,提交是在父表单上(不在局部视图内))

当我在控制器中的表单 (POST) 上点击提交时,我必须通过以下 model.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 作为部分视图的模型,但我需要能够在从父视图提交时访问属性。

这可以吗?如果是怎么办?

谢谢

【问题讨论】:

    标签: asp.net-mvc-3


    【解决方案1】:

    你有几个选择:

    1) 我推荐的一个 -> 不要使用局部视图,而是使用 EditorFor 并为 Person 创建一个编辑器模板。对于局部视图,上下文是您传递给视图的任何模型,这就是您的示例 (1) 有效而 (2) 无效的原因。但是,对于编辑器模板,html 助手会考虑父上下文,并将生成正确的输入名称。 Have a look at Darin Dimitrov's answer 回答类似问题。

    2) 按原样使用第二个示例,但将发布操作更改为如下所示:

    [HttpPost]
    public ActionResult Index(ModelViewModel model) {
        TryUpdateModel(model.Employee);
        **//model.Employee should now be filled!**
        return View();
    }
    

    3) 使用接受前缀作为输入的自定义 html 帮助程序,请参阅 this answer 我不久前发布的示例代码。然后,您可以在局部视图中使用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-24
      • 1970-01-01
      • 1970-01-01
      • 2019-09-13
      • 2010-09-05
      • 2013-11-02
      • 1970-01-01
      • 2011-04-05
      相关资源
      最近更新 更多