2009-06-16 18 views
4

我經常使用也是必填字段的正則表達式驗證程序。這導致了頁面上的冗餘控件。沒有正則表達式驗證器的「必需」屬性,這意味着我需要另一個控件。像這樣:如何結合RegularExpressionValidator控件和RequiredFieldValidator?

<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> 

有沒有一種方法來組合兩個控件,所以我不必輸入太多的代碼?

+1

任何你不會使用自定義驗證器的原因? – Avitus 2009-06-16 15:16:14

+0

爲什麼不直接在你的正則表達式中檢查空格?不需要這樣的必需字段驗證程序。 – dannmate 2015-03-24 03:51:42

回答

3

您可以推出自己的CustomValidator,結合功能。除此之外,不,據我所知。

+0

我很害怕那個。不過值得一提的是。 – 2009-10-09 20:50:35

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驗證空的輸入字段。

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); 

    } 
} 
6

一個常見的問題是驗證部件仍然需要空間時,沒有顯示,這看起來很奇怪,如果你有幾個和IE最後一個被觸發離開與星號或其他錯誤標記之間的差距更大。這可以通過添加:

display="Dynamic" 

...到驗證程序。

但它並不能解決同時出現多個觸發問題,它仍會在一行中顯示很多驗證器錯誤。自定義驗證器可能是最好的解決方案。

相關問題