Как объединить элемент управления RegularExpressionValidator и RequiredFieldValidator? - PullRequest
4 голосов
/ 16 июня 2009

Я часто использую валидаторы выражений регулярных выражений, которые также являются обязательным полем. Что приводит к тому, что похоже на избыточные элементы управления на странице. Нет свойства «Обязательное» для валидатора регулярных выражений, что означает, что мне нужен другой элемент управления. Как это:

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

6 голосов
/ 10 мая 2012

Одной из распространенных проблем является то, что компонент валидатора по-прежнему занимает место, когда он не отображается, что выглядит странно, если у вас их несколько, то есть последний срабатывает, оставляя больший разрыв со звездочкой или другим маркером ошибки. Это можно легко решить, добавив:

display="Dynamic"

... для валидатора.

Но это не решает проблему нескольких срабатываний одновременно, которые по-прежнему будут отображать множество ошибок валидатора подряд. Тогда, вероятно, лучшим решением будет пользовательский валидатор.

3 голосов
/ 16 июня 2009

Вы можете свернуть свой собственный CustomValidator, сочетая в себе функциональность. Кроме этого, нет, насколько мне известно.

1 голос
/ 16 июня 2009

Вы можете переопределить 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 голосов
/ 16 июня 2009

Чтобы быть более точным, вам нужно установить для свойства ValidateEmptyMessage CustomValdiator значение true, иначе он не будет проверять пустые поля ввода. Пример:

<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 по умолчанию проверять пустые поля ввода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...