asp.net自定义验证器问题

时间:2009-09-14 15:27:08

标签: asp.net

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

您将如何处理此类(常见)方案:

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

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

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

2 个答案:

答案 0 :(得分:0)

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

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

根据所选值,让下拉列表自动回复,并根据所选值更改启用哪个验证器。

将所有这些内容包含在UpdatePanel中以获得流畅的用户界面。

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

答案 1 :(得分:0)

我最近 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(或特定字段所需的其他验证)并设置 {{ 3}} 属性(如果将它们分组),则根据选择,根据下拉选择验证该特定组。

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

如果您没有正确调试它,这种方法会变得非常棘手并且会被黑客攻击,因为您需要了解正在进行的所有启用/禁用,否则您可能会发现无法提交页面时所有内容在屏幕上都显示有效,但实际上,当您应该在切换之前禁用每个呼叫上的所有验证器,然后启用您需要的所有验证器时,会启用某些功能。