asp.net-mvc - 如何将 ModelBinder/UpdateModel 方法中的子对象字段列入白名单/黑名单?

标签 asp.net-mvc

我有一个关于如何让 MVC Controller 的 UpdateModel/TryUpdateModel 的白名单和黑名单功能处理子对象的各个属性的问题。例如,假设我有一份问卷,收集有关填写表格的人及其公司的详细信息。

我的 [simplified] 表单字段将被命名,例如:

YourName
YourEmail
Company.Name
Company.Phone

现在在我的模型中,假设我不希望 Company.ID 或 Company.IsPremiumMember 被篡改,所以我想将它们从模型绑定(bind)中排除。为了让它发挥作用,我尝试了白名单、黑名单和两者的组合。我没有任何成功。这是我遇到的问题:

当我在我的白名单中明确包括我上面写的相同的四个字段名时,整个公司不会被绑定(bind)(即,问卷调查.公司为空),除非我在我的白名单中也包括“公司”。但这具有绑定(bind)整个公司的不良影响,而不仅仅是我想要的两个属性。

因此,我随后尝试将 Company.ID 和 Company.IsPremiumMember 包括在我的黑名单中,但这似乎被白名单胜过,并且我认为“事后”并没有过滤掉这些属性。

我知道还有其他方法可以表达“可绑定(bind)性”,例如通过成员上的 [Bind] 属性,但这并不理想,因为我希望在具有不同绑定(bind)规则的其他情况下使用相同的模型类,例如允许管理员设置她想要的任何属性。

我希望一个明显的答案是我应该编写自己的模型绑定(bind)器,并且我已经开始尝试研究如何做到这一点,但我真的希望使用“开箱即用”的解决方案什么(在我看来)似乎是一个非常常见的情况。我正在考虑的另一个想法是制作我自己的 ValueProvider 字典以交给 UpdateModel 方法,但同样,如果有更简单的方法,我宁愿避免这样做。

谢谢你的帮助!
-麦克风

附录#1

以下是我在表单上显示的字段:

你的名字
你的邮件
公司名
公司电话

这是黑帽给我的方式:

YourName=Joe+Smith&YourEmail=joe@example.com&Company.Name=ACME+Corp&Company.Phone=555-555-5555&Company.CreditLimit=10000000

(确保你注意到最后附加的额外参数!)

这就是问题所在:

正如我最初发布的那样,如果没有一些大的解决方法,似乎不可能(使用默认模型绑定(bind)器)阻止设置 CreditLimit ——要么是整个公司,要么什么都没有。我错了吗?

附录#2

我现在非常确信,我的简单目标不可能“开箱即用”。我的解决方案是遍历已发布的表单字段并构建我自己的 ValueProvider 字典,从而将我想要允许的字段列入白名单,并将其交给 UpdateModel。

附录#3

我还没有检查 AutoMapper,但是手头有类似的东西,创建一些 ViewModel/DTO 来处理这种复杂的白名单的解决方案——加上轻松附加相同服务器端验证的能力 (FluentValidation)我已经在我的域对象上使用——似乎是一个可行的解决方案。谢谢大家!

最佳答案

一般来说,最好的方法是创建 查看模型 , 专门为您的 View 构建的模型。这些模型不是领域对象。它们是数据传输对象,用于将数据从 Controller 操作传输到 View 模板。您可以使用 AutoMapper 之类的工具轻松地从您的 View 模型对象创建/更新域模型对象或从您的域模型创建/更新 View 模型对象。

关于asp.net-mvc - 如何将 ModelBinder/UpdateModel 方法中的子对象字段列入白名单/黑名单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/957840/

相关文章:

c# - Javascript 函数参数未显示在 Asp.Net MVC RouteValueDictionary 中?

javascript - 将 Razor 语法与 JavaScript 混合

jquery - MVC 3 jquery renderbody <=> 标题(_layout)

asp.net-mvc - 在mvc中拖放文件

asp.net-mvc - 将 qTip 与 ASP.NET MVC 非侵入式 javascript 验证结合使用

.net - EF在父删除时将外键设置为空

jquery - 为什么 jQuery 模板要给某些字符串添加双引号

javascript - 脚本运行失控

javascript - .remove 不是函数

c# - Web API 路由 - 找到多个与请求匹配的操作