我不理解MVC中的[Bind(Exclude =“ID”)]

时间:2012-03-07 20:31:14

标签: model-view-controller

我真的很困惑......还是。

我前一段时间问了一个类似的问题,但现在我会问它更简单。

我在很多样本和教程中看到了这一点。你怎么能把[Bind(Exclude =“ID”)]放在整个模型上,并期望对模型进行编辑?如果您在POST上获得模型的所有属性而不是ID,那么您如何知道要编辑哪个ID?

即使我正在使用ViewModels ......我可能在没有ID的情况下创建它们。那么在那种情况下...也......我如何知道在编辑中更新了哪个ID?

是的,我知道这有一个“安全”元素。人们可以劫持ID ...所以我们需要让人们在POST期间不要更新值。但是......处理编辑的正确方法是什么?什么是常见做法?

我觉得我错过了一些非常微不足道的东西。

2 个答案:

答案 0 :(得分:3)

在MVC请求由客户端发出请求时由模型绑定器处理。如果你在控制器上包含模型,那么据我所知,你实际上必须通过在参数前加上模型名称来指定你想要绑定的模型(除非你只有一个参数是模型)< / p>

SomeModel_ID

现在,在某些情况下,您可能希望排除绑定某些属性,因为它们会带来安全风险,您似乎对此感到满意。我们将在模型上排除ID,防止任何客户端请求以纯文本格式发布此值。

现在我们为什么要排除整个模型?并非所有控制器参数都由模型绑定器预处理。 RedirectToAction例如不通过模型绑定,所以在这种情况下可以想象,为您营造一个POST控制器操作的新模式,并重定向到一个GET控制器动作,沿着消毒模型传递。该模型不能由客户端填充,但我们可以自己在服务器端填充它。

我绑定到模型的唯一时间是我有一个视图模型和该模型的关联编辑器。这使得将公共编辑器注入页面并封装这些属性变得非常容易。如果你必须将某些属性排除在绑定之外我会认为你做错了。

更新

根据您的评论,我想我可以理解为什么您可能会感到困惑。模型绑定排除器可防止客户端设置模型属性。如果您需要此属性进行更新,那么您根本无法排除它。这意味着用户可能会回发任何ID。在这种情况下,您应该在提供请求的更新之前检查用户是否有权修改与此ID关联的任何对象或数据库记录。 验证参数是一个手动过程。您可以使用数据注释来验证输入,但这不太可能对访问权限有很大帮助。这是你应该在某个阶段手动检查的东西。

答案 1 :(得分:2)

您知道该ID,因为它是通过页面地址传递给您的。所以:

http://yoursite.com/admin/users/edit/20

将使用20填充您的ID参数。如果它在POST中使用(即填写信息),只需手动填写ID字段并以您设计的任何方式将其传递给数据库控制器。

这也不受(琐碎的)劫持的影响,因为如果他们要写除20之外的其他ID,他们现在不会更新ID为20的用户吗? :)