gpt4 book ai didi

c# - 如果 IValidatableObject 的 MVC 实现不能用于执行对象的完整验证,那么它的意义何在?

转载 作者:行者123 更新时间:2023-11-30 22:01:54 24 4
gpt4 key购买 nike

请有人帮助我,因为我在一举验证绑定(bind)在我的 Controller 操作中的对象时遇到了真正的麻烦。

我认为 IValidatableObjectValidate() 方法会在每次绑定(bind)发生时触发,但这不是真的......如果有一个通用模型错误它不会触发。

这让我想知道,我应该如何对我的对象执行完整的复杂验证并返回完整的验证错误集?没有人愿意在网络表单上修复所有报告的错误,然后提交它以获得更多返回给他们的信息。

我以为我可以在 Validate() 方法中执行所有 验证,但这不是真的,因为似乎没有办法远离模型的一般验证。例如,如果您尝试将 string 绑定(bind)到 int,它不会默默地失败,它会添加模型验证错误,然后不会触发 Validate 对对象执行进一步的验证。

所以我无法仅使用一种方法执行所有验证:


  1. 使用验证属性进行一般模型验证
    • 原因
    • 无法执行高级验证,例如基于模型中其他值的条件验证
    • 它的设计目的不仅仅是执行单个字段验证

  1. 实现 IValidatableObject 并在 Validate() 方法中执行完整验证
    • 原因
    • 无法逃脱或“关闭”一般模型验证,因此它会静默失败,以便我可以对对象执行完整验证
    • 如果一般模型验证以任何方式失败(例如绑定(bind)失败),则 IValidatebleObject 并不总是被触发

无论绑定(bind)是否成功,如何一次性对我的对象执行完整验证?

为什么无论绑定(bind)是否成功,IValidatableObject 都不会触发 Validation() 方法?

最佳答案

您似乎遇到的问题是,由于不同的原因,验证发生在框架的不同部分。

首先,进行客户端验证。如果您的所有字段都具有不显眼的客户端验证,那么所有验证都将在客户端上立即进行。

其次是模型绑定(bind)。如果在尝试将项目绑定(bind)到它的模型条目时发生错误,那么这些项目将首先失败。例如,如果您尝试将字符串“xxx”绑定(bind)到 DateTime,它将抛出验证错误,因为它无法将“xxx”转换为 DateTime。而且,由于 DateTime 不可为 null,因此不能简单地将 null 放在那里。

第三是您实际的服务器端数据属性验证。如果您只有部分客户端验证(意味着并非所有字段都有客户端验证),那么您可能会遇到奇怪的情况,即它会在客户端抛出某些项目的验证错误,然后在用户解决这些问题并提交后,服务器端验证发现错误,您会抛出更多错误。

最后,IValidatableObject 被调用。遗憾的是,IValidatableObject 没有客户端验证,因此您要么必须为这些字段创建客户端验证,要么完全禁用客户端验证,以便同时进行所有服务器端验证。

IValidatableObject 是一个相当通用的接口(interface),除了 MVC 之外,它还用在更多地方。 MVC 使用它是因为它是一个方便的现有接口(interface)。而且,它在将客户端验证添加到 MVC 之前就已存在。更好的方法是创建一个实现客户端验证的 ValidationAttribute 派生属性,然后提供适当的 javascript 插件以进行非侵入式验证。

如果在任何步骤中验证失败,则不会继续下一步。即,如果客户端验证失败,它不会调用服务器端。如果数据属性失败,它不会调用 IValidatableObject。

这篇文章中描述了解决此问题的一种方法:

How to force MVC to Validate IValidatableObject

关于c# - 如果 IValidatableObject 的 MVC 实现不能用于执行对象的完整验证,那么它的意义何在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27345976/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com