模型与子对象的绑定
Model binding with a child object
我有一个 class:
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)
我查看了输出 name/id,它基本上是 SelectedApplication_NewDeployment,但不幸的是,将创建签名更改为类似并没有改善结果。是否可以将模型绑定到子对象,如果可以,怎么做?
您的 POST 操作应该接受您的表单正在使用的相同模型,即:
[HttpPost]
public ActionResult Create(ApplicationViewModel model)
然后,您将能够像在视图中一样进行部署:
model.SelectedApplication.NewDeployment
从技术上讲,使用 @Html.EditorFor(m => m.NewDeployment)
是个意外。它这样做的唯一原因是因为该操作接受了一个名为 NewDeployment
的参数。如果参数被命名为其他任何东西,比如 deployment
。它也会失败。
根据 Stephen Muecke 的评论并稍作修改,我找到了更正方法:
[HttpPost]
public ActionResult Create ([Bind(Prefix="SelectedApplication.NewDeployment")] Deployment deployment)
{
// do things
}
我有一个 class:
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)
我查看了输出 name/id,它基本上是 SelectedApplication_NewDeployment,但不幸的是,将创建签名更改为类似并没有改善结果。是否可以将模型绑定到子对象,如果可以,怎么做?
您的 POST 操作应该接受您的表单正在使用的相同模型,即:
[HttpPost]
public ActionResult Create(ApplicationViewModel model)
然后,您将能够像在视图中一样进行部署:
model.SelectedApplication.NewDeployment
从技术上讲,使用 @Html.EditorFor(m => m.NewDeployment)
是个意外。它这样做的唯一原因是因为该操作接受了一个名为 NewDeployment
的参数。如果参数被命名为其他任何东西,比如 deployment
。它也会失败。
根据 Stephen Muecke 的评论并稍作修改,我找到了更正方法:
[HttpPost]
public ActionResult Create ([Bind(Prefix="SelectedApplication.NewDeployment")] Deployment deployment)
{
// do things
}