正则表达式Validate()产生NullReference(ASP.NET)

时间:2009-08-25 21:27:09

标签: c# asp.net regex validation

我在文本框上使用ASP.NET Regular Expression Validator时遇到问题。 这是我的代码的精简版本:

RegularExpressionValidator regex = new RegularExpressionValidator();
regex.ID = "TextBoxRegExValidator" +        ((AVPEditControl)avpControl).ThisFieldRID.ToString(); //random name
regex.ControlToValidate = ((AVPEditControl)avpControl).TextControlID; //this is valid.
regex.ValidationExpression = "\d{3}-\d{2}-\d{4}";
regex.Text = "epic fail";
//later, in an event handler
regex.Display = ValidatorDisplay.None;
regex.ErrorMessage = "";
regex.Validate(); //ERROR
bool valid = AVPEdit.Validator.IsValid;

我标记为“ERROR”的地方是我抛出NullReferenceException的地方。我没有看到我在这里缺少的东西,因为我在调试器中确认正则表达式在该上下文中不为空,并且它也不是验证的控件。

我希望对错误消息的显示方式有更细粒度的控制,这就是为什么我选择不将正则表达式挂钩到任何面板等等。

为什么我可能会从中获得空引用? (这是.NET中的错误吗?)

另外,请注意,当我将Visible设置为0时,这是有效的,但这使得IsValid始终为true。

3 个答案:

答案 0 :(得分:2)

所有ASP.NET验证程序必须是Page的一部分才能运行。您会注意到Validate方法不返回值;这是因为它不打算以您使用它的方式使用。

在Validate方法中,它试图通过其ID查找控件,而没有父命名容器,它无法执行此操作。你正在这样做,没有任何价值可以验证(因为它无法找到控件)。

我会做以下其中一项:

1)将验证器放在ASPX中,然后使用其Validate方法并在之后检查IsValid属性。只需将显示设置为无,它就不会显示在您的用户界面中。

2)手动运行正则表达式。如果您只使用Regex.IsMatch,那么您在这里编写的代码要多得多。

(请注意,如果您使用Reflector,浏览到RegularExpressionValidator,您将看到它将尝试调用this.NamingContainer以及其他在不成为控件集合一部分的情况下为null的内容)

答案 1 :(得分:1)

我认为你应该将它添加到你的控件集合中,可能在一个不可见的div控件中使它工作。

但是如果要以编程方式验证文本框,为什么不编写一个使用模式来验证控件并返回有效性的方法?

答案 2 :(得分:0)

我认为如果你想使用后面的代码进行验证,你可以使用类似的东西

Match m = Regex.Match(yourtext,"\d{3}-\d{2}-\d{4}")

if(m.Success)
{
//valid
}

else
{
//invalid
}