模型与子对象绑定

时间:2015-02-16 20:48:53

标签: razor asp.net-mvc-5 model-binding

我有一个班级:

public class Application
{
      ....
      public Deployment NewDeployment { get; set; }
      ....
}

我在Application View文件夹中有一个用于部署的编辑器模板。

ApplicationViewModel有一个SelectedApplication(类型为Application),在我的Index.cshtml中,我使用ApplicationViewModel作为我的模型,我有这个调用:

@using (Html.BeginForm("Create", "Deployment", new { @id = Model.SelectedId, 
  q = Model.Query }, FormMethod.Post, new { id = "form", role = "form" }))
{
  @Html.EditorFor(m => m.SelectedApplication.NewDeployment)
}

然后在我的DisplayTemplates \ Deployment.cshtml中正确地呈现控件(但是,它可能只是拉动显示代码而没有与NewDeployment对象的内容有关)。在我提交之前,一切都在世界各地。在这个阶段,一切似乎都很好。控制器看起来像:

public class DeploymentController : Controller
{
  [HttpPost]
  public ActionResult Create(Deployment NewDeployment)
  {
    Deployment.CreateDeployment(NewDeployment);
    return Redirect("/Application" + Request.Url.Query);
  }
}

然而,当它转到DeploymentController - >创建,该对象具有值的空值。如果我将NewDeployment对象移动到ApplicationViewModel,它可以正常工作:

@Html.EditorFor(m => m.NewDeployment)

我查看了输出名称/ id,它基本上是SelectedApplication_NewDeployment,但不幸的是,将Create签名更改为类似的didn不会改善结果。是否可以将绑定模型绑定到子对象,如果是,如何?

2 个答案:

答案 0 :(得分:2)

您的POST操作应接受您的表单使用的相同模型,即:

[HttpPost]
public ActionResult Create(ApplicationViewModel model)

然后,您将能够以与在视图中相同的方式进行部署:

model.SelectedApplication.NewDeployment

使用@Html.EditorFor(m => m.NewDeployment)工作在技术上是一个意外。它的唯一原因是因为该操作接受了名为NewDeployment的参数。如果参数已被命名为其他任何内容,例如deployment。它本来也会失败。

答案 1 :(得分:0)

根据Stephen Muecke的评论并稍作修改,我能够找到纠正方法:

[HttpPost]
public ActionResult Create ([Bind(Prefix="SelectedApplication.NewDeployment")] Deployment deployment)
{
  // do things
}