【发布时间】:2014-05-27 13:48:55
【问题描述】:
这将是一个两部分的问题:
我有多个文本框。它们都是必填字段。如何使用一个验证器来验证所有的文本框? (即如果任何一个文本框为空,它将返回错误)
我有多个文本框。至少其中一个是必填字段。如何使用 ONE 验证器来验证此类条件? (即,如果所有文本框都为空,它将返回错误,但只要这组文本框中的一个有内容,它就会通过。)
【问题讨论】:
标签: c# asp.net validation
这将是一个两部分的问题:
我有多个文本框。它们都是必填字段。如何使用一个验证器来验证所有的文本框? (即如果任何一个文本框为空,它将返回错误)
我有多个文本框。至少其中一个是必填字段。如何使用 ONE 验证器来验证此类条件? (即,如果所有文本框都为空,它将返回错误,但只要这组文本框中的一个有内容,它就会通过。)
【问题讨论】:
标签: c# asp.net validation
您需要使用Custom Validator (MSDN Link),因为您将无法使用基于“单一控制”的验证器做您想做的事情。
这将允许您编写客户端和服务器端代码,并做出相应的响应。
实现服务器端代码非常重要,因为知道自己在做什么的人很容易绕过客户端。客户端只是一个不错的选择。
【讨论】:
RequiredField、Range、RegularExpression 等)都将为您执行客户端和服务器端(如果检测到的浏览器支持)。因为CustomValidator是你自己写的,所以你的工作就是提供客户端(可选)和服务端(技术上可选,但绝对必要)代码
Page.IsValid,否则任何未通过检查的验证器都可能被忽略
为每个文本框设置一个必填字段验证器并将它们分配给一个验证组。您可以使用ValidationSummary control 在单个列表中显示所有结果。
如果您想执行“其中一个”逻辑,可以使用custom validator。不幸的是,这需要您同时实现客户端和服务器端验证代码,没有现成的验证器。
【讨论】:
我不知道有什么方法可以做到这一点,而不是创建自己的自定义验证属性。有很多方法可以实现这一点,但我将使用的方法是将属性分配给所有包含的属性,然后使用反射来检查其中至少一个是否具有值(通过检查它们是否具有属性)。在 ValidationAttribute 的 IsValid 方法中,您拥有对实例和类型的所有访问权限,因此反射应该可以解决问题。此外,如果您希望客户端验证工作,您可以扩展 IClientValidatable,通过 GetClientValidationRules() 规则参数发送所有必填字段的值,最后编写自己的 javascript 函数来执行规则。这听起来工作量很大,而且确实如此,但如果你让它足够灵活,它应该是可重用的。向类中的属性添加和删除属性应该在验证列表中包含/排除字段(如果我可以这样称呼它的话)。
当我遇到类似问题时,这里是我对这些东西更加熟悉的地方: Conditional Validation in ASP MVC
【讨论】: