2009-06-16 20 views
4

私はしばしば必須フィールドである正規表現バリデーターを使用します。これは、ページ上の冗長なコントロールのように見えるものにつながります。 regexバリデータの "Required"プロパティはありません。つまり、別のコントロールが必要です。このように: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> 

は、私はそんなにコードを入力する必要はありませんので、2つのコントロールを結合する方法はありますか?

+1

カスタムバリデータを使用しない理由は何ですか? – Avitus

+0

あなたの正規表現で空白をチェックするだけではどうですか?そのようなフィールドバリデーターは必要ありません。 – dannmate

答えて

3

独自のCustomValidatorをロールして、その機能を組み合わせることができます。それ以外は、私の知る限りではありません。

+0

私はそれを恐れていました。しかし、頼む価値があった。 –

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

あなたは一つの共通の問題は、あなたは、いくつかを持っているし、最後の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); 

    } 
} 
+0

それは素晴らしいです!クライアント側はどうですか? –

+0

CustomValidatorは良いアイデアだと思いますが、同じトリックを行うこともできます)、クライアント側の評価メソッドをオーバーライドします。 protected override OnPreRender(EventArgs e) { base.OnPreRender(e); Page.ClientScript.RegisterStartupScript(GetType()、 "customVal"、ClientID + @ ")評価関数= function(val) { var value = ValidatorGetValue(val.controltovalidate); if(ValidatorTrim(value).length == 0) falseを返します; return RegularExpressionValidatorEvaluateIsValid(val); } "、true); } – Gagarin

6

を上書きすることができますアスタリスクや他のエラーマーカーとの間隔が大きくなります。

display="Dynamic" 

を...バリに:これは簡単に追加することによって解決することができます。

しかし、複数のトリガーを同時に問題にすることはできませんが、同時に複数のバリデーターエラーが連続して表示されます。おそらくカスタムバリデーターが最適な解決策になります。

関連する問題