Model view controller 我不知道';不理解MVC中的[Bind(Exclude=";ID";)]

Model view controller 我不知道';不理解MVC中的[Bind(Exclude=";ID";)],model-view-controller,Model View Controller,我真的被这搞糊涂了。。。还是 我之前问过一个类似的问题,但现在我会问得更简单 我在很多示例和教程中都看到了这一点。如何将[Bind(Exclude=“ID”)]放在整个模型上,并期望对模型进行编辑?如果您在一篇文章中获得了模型的所有属性,但没有ID,那么您如何知道要编辑哪个ID 即使我使用的是ViewModels。。。我可能是在没有ID的情况下创建它们。所以在这种情况下。。。也。。。我如何知道编辑时更新了哪个ID 是的,我知道这其中有一个“安全”因素。人们可以劫持身份证。。。因此,我们需要防止人

我真的被这搞糊涂了。。。还是

我之前问过一个类似的问题,但现在我会问得更简单

我在很多示例和教程中都看到了这一点。如何将[Bind(Exclude=“ID”)]放在整个模型上,并期望对模型进行编辑?如果您在一篇文章中获得了模型的所有属性,但没有ID,那么您如何知道要编辑哪个ID

即使我使用的是ViewModels。。。我可能是在没有ID的情况下创建它们。所以在这种情况下。。。也。。。我如何知道编辑时更新了哪个ID

是的,我知道这其中有一个“安全”因素。人们可以劫持身份证。。。因此,我们需要防止人们在发布期间更新价值。但是那么,处理编辑的正确方法是什么?通常的做法是什么


我觉得我遗漏了一些非常琐碎的东西。

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

http://yoursite.com/admin/users/edit/20
将用
20
填充ID参数。如果它用于POST(即,信息已填写),只需手动填写ID字段,并以您设计的任何方式将其传递给数据库控制器


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

在MVC中,当客户机发出请求时,模型绑定器将处理请求。如果在控制器上包含模型,那么据我所知,实际上必须通过在参数前面加上模型名来指定要绑定的模型(除非只有一个参数是模型)

现在,在某些情况下,您可能希望将某些属性从绑定中排除,因为它们会带来安全风险,您似乎很乐意将其作为一个概念。我们将排除模型上的ID,防止任何客户端请求以纯文本形式发布此值

现在为什么我们可以排除整个模型?并非所有控制器参数都由模型绑定器预处理。例如,RedirectToAction不通过模型绑定器,因此在本例中,您可以在控制器后操作中创建一个新模型,并重定向到GET controller操作,传递一个经过清理的模型。该模型不能由客户端填充,但我们可以在服务器端自行填充

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

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

我看不出这是如何免疫的。您可以开始执行HttpGet来编辑记录20。然后,您可以对相同的url执行HttpPost,只是将20更改为21。现在你又更新了一条记录,是吗?是的,但你没有回避任何事情。就像你手动打开21并更新它一样;所有特定于use 21的服务器端安全性仍将生效。是的,因此我们排除了模型上的ID“防止任何客户端请求将此值置于纯文本中”。所以现在。。。我们如何知道要更新的记录?如果我们想更新记录,我们如何在发布过程中以不可劫持的方式传递ID?你没有。它不是为了保护您不回发格式错误的值。这是一个二进制条件。你可以发回,也可以不发回。如果您需要发回一个ID,那么您有责任在控制器中检查它,并且您显然需要允许它被发回。所以换句话说。。。如果我正在编辑,我不应该在ID上执行绑定排除。在进行更新之前,我应该确保ID属于登录用户。。或也许在HttpGet期间将其粘贴在会话中,并在HttpPost期间进行比较,以确保其ID相同。我的想法正确吗?是的,这绝对正确。。。我应该提到的是,我不喜欢会议。它们不是RESTful的(这可能不是你所关心的),但是在某些情况下它们可能会变得不同步,比如说在你编辑时你的权限被撤销了。。。有些人会发现具有数据库权限的会话实现是完全可以接受的。无论如何,大多数应用程序都需要会话进行合理的身份验证。
SomeModel_ID