我的控制器上有一个动作,如下所示:
[HttpPost]
public ActionResult Edit(EditMyObjectViewModel editMyObjectViewModel)
{
}
EditMyActionViewModel
包含MyObject
将其传递到编辑视图(上述控制器操作的GET版本)
重新发布时,ID未设置....
如果我将控制器更改为:
[HttpPost]
public ActionResult Edit(Guid id, EditMyObjectViewModel editMyObjectViewModel)
{
editMyObjectViewModel.ID = id;
}
这有效,但似乎有点不对劲?
我想我还可以将视图上的隐藏字段绑定到Model.ID?
这里的惯例是什么?
修改
Model / ViewModels如下:
public class EditMyObjectViewModel
{
public IEnumerable<SomeItem> SomeUnrelatedStuff { get; set; }
public MyObject MyObject { get; set; }
}
public class MyObject
{
public guid ID { get; set; }
public string Name { get; set; }
}
查看如下:
@model MyApp.Models.EditMyObjectViewModel
@using (Html.BeginForm("Edit", "License", FormMethod.Post, new { @class = "form form-horizontal" }))
{
@Html.TextboxFor(x=>x.MyObject.Name);
<input type="submit" class="btn btn-success" value="Create Modification" />
}
答案 0 :(得分:6)
你是对的,你需要创建一个隐藏字段来保存id,或者你需要将ID作为参数添加到action方法中。
问题在于id来自何处以及如何填充。默认模型绑定器从表单字段填充模型;它不会使用查询参数。并且查询参数不会进入模型,但会在操作方法的参数中填充。
您可以做的另一件事是创建自定义模型绑定器以将查询参数填充到模型中。但在这种情况下,这感觉有些过分。另外,您必须为每个页面/模型执行此操作。
是我,我将id添加到action方法中。