【问题标题】:asp.net custom validator questionasp.net 自定义验证器问题
【发布时间】:2009-09-14 15:27:08
【问题描述】:

我熟悉如何为简单的情况编写和使用自定义验证器(即确保日期大于或等于某个值)。

您将如何处理这种(常见)场景:

我有一个包含 5 个选项的下拉列表,根据选择的选项,需要验证其他几个字段。例如,如果从下拉列表中选择“3”,我需要确保填写字段 a、b、c,但如果从下拉列表中选择“2”,我需要确保 a、b为空白,e,f 填写等。

我想问题是,自定义验证器是否与下拉列表相关联,或者您是否在 a/b/c/d/e/f 等所有字段上放置了自定义验证器...或者是有我可以调用的表单级自定义验证器的概念吗?

可能至少有十种不同的方法可以做到这一点,但要寻找最干净的选择。

【问题讨论】:

  • 您是在客户端还是服务器端进行此验证?换句话说,DropDownList 的 AutoPostBack 属性是否设置为 true?

标签: asp.net


【解决方案1】:

如果您不害怕使用 MS AJAX 工具包,您可以制作一些可以快速完成您想做的事情(如果可能不是最好的性能友好性)。

创建几个不同的自定义验证器,每个验证器代表与下拉列表项相关的不同验证目标。将每个验证器的 Enabled 属性设置为 false。

让下拉列表在更改时自动回发并根据所选值更改启用的验证器。

将所有这些都包含在 UpdatePanel 中,以获得流畅的 UI。

另一种方法涉及 jQuery 和其中一个验证插件。您只需要花很短的时间来适应您使用的任何验证插件。 (我喜欢这种方法,因为它可以在不同的 Web 开发平台上高度重用。)最终,您将在下拉列表中附加一个客户端事件,以向您的不同字段添加或删除 CSS 样式;但是请记住进行防御性编程并包括服务器端验证。

【讨论】:

    【解决方案2】:

    我最近 answered a similar question 处理了 1 个字段。您应该能够扩展它以检查各种选择,然后检查相关字段是否已填写。

    验证可以这样更新:

    bool isValid = true;
    
    switch (dropdown.SelectedValue)
    {
        case "Option1":
            // check fields for Option1
            break;
        case "Option2":
            // check fields for Option2
            break;
        default:
            isValid = true;
    }
    
    args.IsValid = isValid;
    

    您的下一个问题可能是“我如何指示哪些字段对用户无效?”有几种不同的可能性。

    如果这些字段在您的 UI 上可视地分组在一起,您只需更新 CustomValidator 的 ErrorMessage 以显示“需要 XYZ 字段”。但是,如果它们不是,或者如果您希望为每个无效字段添加一条消息,您可以添加带有适当消息的 RequiredFieldValidator(或特定字段需要的其他验证)并设置 @987654322 @ 属性(如果对它们进行分组有意义),然后根据选择,根据下拉选择验证该特定组。

    如果不同的字段可以与不同的下拉选项相关联,则 ValidationGroup 的想法将不可行。相反,您可能会禁用每个字段的 RequiredFieldValidator,为每个字段的验证器维护一个列表,并且在 switch 语句中,您可以遍历它们,启用它们,调用 IsValid on它们(将值存储在 bool 中并 AND 结果),然后将最终 bool 结果用于 CustomValidator 的 args.IsValid 属性。在 my reply to another question 中可以看到 AND'ing 结果的示例。

    如果您没有正确调试它,这种方法可能会变得非常棘手并且感觉被破解,因为您需要了解所有启用/禁用的情况,否则您可能会发现您无法提交页面一切在屏幕上看起来都是有效的,但实际上,当您应该在切换之前禁用每个调用上的所有验证器时,某些东西被启用了,然后只启用了您需要的那些。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-09
      • 1970-01-01
      • 2020-10-24
      • 2011-08-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多