【问题标题】:ASP.NET Validator for multiple fields多个字段的 ASP.NET 验证器
【发布时间】:2014-05-27 13:48:55
【问题描述】:

这将是一个两部分的问题:

  1. 我有多个文本框。它们都是必填字段。如何使用一个验证器来验证所有的文本框? (即如果任何一个文本框为空,它将返回错误)

  2. 我有多个文本框。至少其中一个是必填字段。如何使用 ONE 验证器来验证此类条件? (即,如果所有文本框都为空,它将返回错误,但只要这组文本框中的一个有内容,它就会通过。)

【问题讨论】:

    标签: c# asp.net validation


    【解决方案1】:

    您需要使用Custom Validator (MSDN Link),因为您将无法使用基于“单一控制”的验证器做您想做的事情。

    这将允许您编写客户端和服务器端代码,并做出相应的响应。

    实现服务器端代码非常重要,因为知道自己在做什么的人很容易绕过客户端。客户端只是一个不错的选择。

    【讨论】:

    • 您是说工具箱中的验证是客户端吗?
    • 据我所知,所有“其他”验证器(RequiredFieldRangeRegularExpression 等)都将为您执行客户端和服务器端(如果检测到的浏览器支持)。因为CustomValidator是你自己写的,所以你的工作就是提供客户端(可选)和服务端(技术上可选,但绝对必要)代码
    • @C.J.将其视为客户端作为对用户的有用检查,将服务器端视为安全检查。现有的验证器都为你做,你也应该用你的。
    • @C.J. - Liath 是正确的,客户端只是提供更好的用户体验(因为不需要回发)。万一您不知道,您还应该始终在事件处理程序中检查Page.IsValid,否则任何未通过检查的验证器都可能被忽略
    【解决方案2】:

    为每个文本框设置一个必填字段验证器并将它们分配给一个验证组。您可以使用ValidationSummary control 在单个列表中显示所有结果。

    如果您想执行“其中一个”逻辑,可以使用custom validator。不幸的是,这需要您同时实现客户端和服务器端验证代码,没有现成的验证器。

    【讨论】:

    • 每当我看到对w3fools.com 的引用时,我都会颤抖(原因请参见链接网站)
    • @freefaller 通常我会同意,但它是 SO 之外排名最高的示例。我选择了一个不同的。
    • 不幸的是,当他们达到顶峰时,他们继续保持在顶峰......链接到他们有助于让他们保持在那里。我会自动跳过我从他们那里看到的任何内容
    【解决方案3】:

    我不知道有什么方法可以做到这一点,而不是创建自己的自定义验证属性。有很多方法可以实现这一点,但我将使用的方法是将属性分配给所有包含的属性,然后使用反射来检查其中至少一个是否具有值(通过检查它们是否具有属性)。在 ValidationAttribute 的 IsValid 方法中,您拥有对实例和类型的所有访问权限,因此反射应该可以解决问题。此外,如果您希望客户端验证工作,您可以扩展 IClientValidatable,通过 GetClientValidationRules() 规则参数发送所有必填字段的值,最后编写自己的 javascript 函数来执行规则。这听起来工作量很大,而且确实如此,但如果你让它足够灵活,它应该是可重用的。向类中的属性添加和删除属性应该在验证列表中包含/排除字段(如果我可以这样称呼它的话)。

    当我遇到类似问题时,这里是我对这些东西更加熟悉的地方: Conditional Validation in ASP MVC

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      相关资源
      最近更新 更多