ASP.NET MVC发布模型ID的更好方法是什么?

时间:2012-06-22 13:13:01

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

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:11)

如果我的GET操作包含我的路线中的ID:/Products/Edit/1,那么我通常将其保留为路线值:

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

但这纯粹是我的偏好。没有正确或错误的方法。

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

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

[HttpPost]
public ActionResult Edit(EditProductViewModel model)

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

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

答案 1 :(得分:1)

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

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

[HttpPost]
public ActionResult Edit(EditProductViewModel model)

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

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

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

在该场景中创建模型时,我会认为特殊问题...特权问题仍然适用于:)

所有这一切,我自己都不是专家:)

顺便说一下......我认为隐藏的字段没有任何问题,我一直都在使用它。然而,这是一个ajax调用它可能不需要,因为它将是你发布ajax调用的一部分。