【问题标题】:Posting to Edit controller action not passing ID of model发布到编辑控制器操作未传递模型 ID
【发布时间】:2012-11-15 16:43:25
【问题描述】:

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

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

【问题讨论】:

  • 这很奇怪。能不能展示一下对应的视图?
  • 已编辑以包含视图和视图模型 - 还说明了 EditMyObjectViewModel 包含 MyObject

标签: asp.net-mvc asp.net-mvc-3


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2013-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    • 2018-06-23
    • 1970-01-01
    • 2019-10-18
    相关资源
    最近更新 更多