1

是否可以安全地以编程方式获取刚刚回发到控制器的视图中的字段列表?

我注意到脚手架的默认实现存在问题,在

DB.Entry(model).State = EntityState.Modified
DB.SaveChanges()

问题是,如果我没有在视图中包含要编辑的字段,它将被 .NET 在创建对象时分配的字段的默认值覆盖。例如。如果我有一个带有 ID、Email 和 PasswordHash 的 User 类,并且我想只允许用户更新他们的电子邮件地址,如果我没有为 PasswordHash 字段包含任何内容,它会在传递到控制器时重置为 NULL作为NULL。目前,我正在通过从数据库中检索当前对象并仅从传入的模型更新我知道在视图中的字段来解决它。对于小表来说这不是问题,但我会喜欢有一个我可以全面应用的通用解决方案,特别是对于可能在开发过程中的大型表,我不想每次都更新代码。

我知道我可以遍历 POST 变量并检查它们以查看已发布的内容,但这会产生安全问题,因为用户可能会注入我不希望他们编辑的其他字段。我想我可以明确排除那些我不想让他们编辑的内容,但话又说回来,如果我可以避免它,我宁愿不必列出那些,因为这是额外的维护工作。

我认为这里有两个问题,我不确定是否可以解决...

  • 获取回发的视图
  • 确定该视图中包含哪些字段(我可能需要暂时再次构建它才能做到这一点?)

我想我可能可以忽略第一个,因为我只能在控制器上使用该方法来获取单个视图。这仍然没有我想要的那么整洁,但它确实将问题减少到仅确定哪些字段在视图中。

4

1 回答 1

1

如果视图只需要某些属性,请创建一个只包含这些属性的界面。在 HttpGet 和 HttpPost 方法中使用此接口。

然后您可以使用 AutoMapper 之类的东西将视图模型映射到您的实体。

于 2012-11-27T10:27:13.103 回答