如何结合RegularExpressionValidator控件和RequiredFieldValidator?

时间:2009-06-16 15:13:36

标签: c# asp.net regex validation

我经常使用也是必填字段的正则表达式验证器。这导致页面上看起来像冗余控件。正则表达式验证器没有“必需”属性,这意味着我需要另一个控件。像这样:

<asp:TextBox ID="tbCreditCardNumber" runat="server" Width="200"></asp:TextBox>
<asp:RegularExpressionValidator ID="revCreditCardNumber" runat="server"
    ControlToValidate="tbCreditCardNumber" ValidationGroup="CheckoutGroup" ErrorMessage="Invalid Credit Card Number!"
    ValidationExpression="^(3[47][0-9]{13}|5[1-5][0-9]{14}|4[0-9]{12}(?:[0-9]{3})?)$">*</asp:RegularExpressionValidator>
<asp:RequiredFieldValidator ID="rfvCreditCardNumber" runat='server' ControlToValidate="tbCreditCardNumber" ValidationGroup="CheckoutGroup"
    ErrorMessage="Credit Card Number Required">*</asp:RequiredFieldValidator>

有没有办法合并两个控件,所以我不必输入这么多代码?

4 个答案:

答案 0 :(得分:6)

一个常见的问题是,验证器组件在未显示时仍然占用空间,如果您有多个,则看起来很奇怪,即最后一个被触发,留下较大的间隙到星号或其他错误标记。这可以通过添加:

轻松解决
display="Dynamic"

...给验证员。

但是它并没有解决同时发生多次触发的问题,它仍然会连续显示许多验证器错误。然后,自定义验证器可能是最佳解决方案。

答案 1 :(得分:3)

您可以结合使用功能来滚动自己的CustomValidator。除此之外,不是我不知道的。

答案 2 :(得分:1)

您可以覆盖 EvaluateIsValid 方法

    public class RegularExpressionValidatorEx : RegularExpressionValidator
{
    protected override bool EvaluateIsValid()
    {
        string controlValidationValue = base.GetControlValidationValue(base.ControlToValidate);
        if ((controlValidationValue == null) || (controlValidationValue.Trim().Length == 0))
        {
            return false;
        }
        return base.EvaluateIsValid();
    }

    protected override void OnPreRender(EventArgs e)
    {
        base.OnPreRender(e);
        Page.ClientScript.RegisterStartupScript(GetType(), "customVal", ClientID + @".evaluationfunction = function(val){
var value = ValidatorGetValue(val.controltovalidate);
if (ValidatorTrim(value).length == 0)
    return false;
return RegularExpressionValidatorEvaluateIsValid(val);}", true);

    }
}

答案 3 :(得分:0)

更具体地说,您需要将CustomValdiator的ValidateEmptyMessage属性设置为true,否则他将不会验证emprty输入字段。例如:

<script type="text/javascript">
    function clientValidate(sender, args){
        if (args.Value.length == 0) {
            args.IsValid = false;
        }
    }

</script>
 <asp:CustomValidator runat="server" 
        ID="CustomValidator" 
        ControlToValidate="TextBox1"
        ClientValidationFunction="clientValidate"
        ValidateEmptyText="true"
        Text="Error!">
    </asp:CustomValidator>

但是,正如您所看到的,这绝不比您以前的代码短,所以如果由我决定,在这种情况下使用自定义验证器有没有意义。至于原始问题,遗憾的是没有办法让默认的RegExpressValidator验证空输入字段。