我在文本框上使用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。
答案 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
}