我有一个ViewModel我绑定到一个视图:
ProductViewModel model = Mapper.Map<Product, ProductViewModel>(product);
return View(model);
视图(和视图模型)用于编辑Product
,因此ProductViewModel
具有与数据库中的ID对应的ID属性。
要将ID发回控制器,我在视图中的表单中执行此操作:
@Html.HiddenFor(x => x.Id)
即使这有效 - 我想知道是否有更好的方法将ID发回控制器?路线值可能吗?或者这是一种相当标准的模式/方法?
答案 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调用的一部分。