3

我的控制器上有一个如下所示的操作:

[HttpPost]
public ActionResult Edit(EditMyObjectViewModel editMyObjectViewModel)
{
}

EditMyActionViewModel包含一个MyObject

这被传递到编辑视图(上述控制器操作的 GET 版本)

当它重新发布时,ID 没有设置....
如果我将控制器更改为:

[HttpPost]
public ActionResult Edit(Guid id, EditMyObjectViewModel editMyObjectViewModel)
{
    editMyObjectViewModel.ID = id;
}

这行得通,但似乎有点不对劲?

我想我也可以将视图上的隐藏字段绑定到 Model.ID?

这里有什么约定?

编辑

模型/视图模型如下:

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" />
}
4

1 回答 1

8

没错,您要么需要创建一个隐藏字段来保存 id,要么需要将 ID 作为参数添加到操作方法中。

问题只是 id 来自哪里以及它是如何填充的。默认模型绑定器从表单字段填充模型;它不会使用查询参数。并且查询参数不会进入模型,但会填充到操作方法的参数中。

您可以做的另一件事是创建自定义模型绑定器以将查询参数填充到模型中。但在这种情况下,这感觉有点矫枉过正。另外,您必须为每个页面/模型执行此操作。

是我,我会将 id 添加到操作方法中。

于 2012-11-15T16:54:07.590 回答