【问题标题】:Model binding with a child object与子对象的模型绑定
【发布时间】:2015-02-18 04:47:28
【问题描述】:

我有一堂课:

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

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

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

@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 -> Create 时,对象的值具有空值。如果我将 NewDeployment 对象移动到 ApplicationViewModel,它可以正常工作:

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

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

【问题讨论】:

  • 如果只想回发一个子模型,可以使用public ActionResult Create(Bind(Prefix="SelectedApplication")]Deployment NewDeployment)

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


【解决方案1】:

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

[HttpPost]
public ActionResult Create(ApplicationViewModel model)

然后,您将能够像在视图中一样进行部署:

model.SelectedApplication.NewDeployment

从技术上讲,使用@Html.EditorFor(m => m.NewDeployment) 起作用是个意外。它这样做的唯一原因是该操作接受了一个名为NewDeployment 的参数。如果参数被命名为其他任何名称,例如 deployment。它也会失败。

【讨论】:

  • 我的表单只封装了 NewDeployment 组件。这个区域实际上有很多形式(在部署渲染代码之前是 ApplicationController.Create 代码为应用程序渲染相同的东西,因为它们都是非常接近的模态。是否可以在其中工作还是没有?
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多