8

我有一个绑定到视图的 ViewModel:

ProductViewModel model = Mapper.Map<Product, ProductViewModel>(product);
return View(model);

视图(和视图模型)用于编辑,Product因此ProductViewModel具有与数据库中的 ID 对应的 ID 属性。

并将 ID 发布回控制器,我在视图上的表单中执行此操作:

@Html.HiddenFor(x => x.Id)

即使这可行- 我想知道是否有更好的方法将 ID 发布回控制器?路线值可能吗?或者这是一个相当标准的模式/方法?

4

2 回答 2

11

如果我有一个在我的路由中包含 id 的 GET 操作:/Products/Edit/1那么我通常将其保留为路由值:

[HttpPost]
public ActionResult Edit(int id, EditProductViewModel model)

不过,这纯粹是我的偏好。没有正确或错误的方法来做到这一点。

这个方法的好处是你不再需要使用 Hidden 值来传递它,因为它是 URL 的一部分。实际上,如果您确实使用 Hidden 值传递它,我相信它将被忽略。

或者,由于 id 是路由的一部分,您甚至不需要单独的参数:

[HttpPost]
public ActionResult Edit(EditProductViewModel model)

public class EditProductViewModel 
{
    public int Id { get; set; }
}

同样,这纯粹是一种偏好。

于 2012-06-22T13:27:42.223 回答
1

我认为答案是,这取决于。

您的整个对象是否正在被编辑和发回?如果是这样,我建议将 ID 作为模型的一部分发回:

[HttpPost]
public ActionResult Edit(EditProductViewModel model)

我认为这是一件完全有效的事情。不过要小心。如果正在编辑的资源是受保护的资源,请确保验证用户具有正确的权限。

如果是部分编辑,也许只是通过 Ajax 调用编辑评论,我可能更想做:

[HttpPost]
public ActionResult Edit(int id, string comment)

在那种情况下创建模型时,我会认为这是矫枉过正......特权问题仍然适用:)

说了这么多,我自己不是专家:)

顺便说一句……我不认为隐藏字段有什么问题,我一直在使用它。然而,它是一个 ajax 调用,可能不需要它,因为它是您发布 ajax 调用的一部分。

于 2012-06-22T13:39:11.833 回答