我有一个班级:
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不会改善结果。是否可以将绑定模型绑定到子对象,如果是,如何?
答案 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
}