发布编辑控制器操作而不传递模型的ID

Ale*_*lex 2 asp.net-mvc asp.net-mvc-3

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

[HttpPost]
public ActionResult Edit(EditMyObjectViewModel editMyObjectViewModel)
{
}
Run Code Online (Sandbox Code Playgroud)

EditMyActionViewModel 包含一个 MyObject

这被传递到Edit视图(上述控制器动作的GET版本)

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

[HttpPost]
public ActionResult Edit(Guid id, EditMyObjectViewModel editMyObjectViewModel)
{
    editMyObjectViewModel.ID = id;
}
Run Code Online (Sandbox Code Playgroud)

这有效,但似乎有点不对劲?

我想我也可以将视图上的隐藏字段绑定到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; }
}
Run Code Online (Sandbox Code Playgroud)

视图如下:

@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" />
}
Run Code Online (Sandbox Code Playgroud)

Jef*_*ver 6

你是对的,你需要创建一个隐藏字段来保存id,或者你需要将ID作为参数添加到action方法中.

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

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

它是我,我将id添加到action方法中.