你如何确定哪个验证器失败了?

37

我正在处理一个页面,发现Page.IsValid = false,我试图确定是哪个控件导致了验证问题。

4个回答

29

感谢Steven提供的答案,但是由于this.Validators.Where()存在一些问题,我不得不进行了一些更改以使它起作用。

using System.Linq;

List<IValidator> errored = this.Validators.Cast<IValidator>().Where(v => !v.IsValid).ToList();

3
它没有按照@Steven所说的那样工作,但这个答案是完美的。只需要将“this”更改为“Page”。谢谢。 - StinkyCat
我使用 Page.Validators 而不是使用 this.Validators。 - JohnnyBizzle
Page.Validators 对我没用.. 是的,还有人在使用 WebForms... 呃。但这个答案很好用。谢谢 +1 - Piotr Kula
在此答案的基础上,我使用以下代码来识别无效的验证器:'if (Page.IsValid) { // do something } else { // 页面无效 List<IValidator> invalides = this.Validators.Cast<IValidator>().Where(v => !v.IsValid).ToList(); foreach (var invalid in invalides) { Debug.WriteLine(invalid.ErrorMessage); } }' - CAK2

24

在代码(page_load)中,您可以这样做:
(根据MSDN:http://msdn.microsoft.com/en-US/library/dh9ad08f%28v=VS.80%29.aspx

If (Me.IsPostBack) Then
    Me.Validate()
    If (Not Me.IsValid) Then
        Dim msg As String
        ' Loop through all validation controls to see which 
        ' generated the error(s).
        Dim oValidator As IValidator
        For Each oValidator In Validators
            If oValidator.IsValid = False Then
                msg = msg & "<br />" & oValidator.ErrorMessage
            End If
        Next
        Label1.Text = msg
    End If
End If

在标记中,您可以...


  • 将“文本”放在验证器上(例如星号...)
  • 或使用validation_summary控件(它需要在验证器上有错误消息)...

21
简述为this.Validators.Where(v => !v.IsValid) - Steven
1
@Steven -- 我一直想学习那个 -- 非常酷 -- 你应该得到认可。 - Chains
2
其实很容易为我点赞。只需点击我评论左侧的“向上箭头”即可 ;-). - Steven
2
@Steven_ 这段代码无法编译,因为 ValidatorCollection 没有实现 IEnumerable<IValidator> 接口,但你可以使用 var v = Validators.Cast<IValidator>().Where(v => !v.IsValid); - Tim Schmelter

8

接受的答案允许您找到验证失败的验证器的验证消息。如果您想查找未通过验证的控件的ID,可以将验证器转换为BaseValidator并公开ControlToValidate属性。例如:

For Each v As BaseValidator In Page.Validators
    If Not v.IsValid Then
        ' You can see the control to validate name and error message here.
        Debug.WriteLine(v.ControlToValidate)
        Debug.WriteLine(v.ErrorMessage)
    End If
Next

2

要检查哪个Validator正在触发,请检查Firebug中的HTML,如果任何一个Validator没有display:none;属性或者在其属性中具有visibility:visible,那么它就是导致Page.IsValidfalse的原因。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接