2013-04-17 6 views
2

У меня есть два текстовых поля, для них необязательно заполнять оба, но обязательно, чтобы пользователь заполнил хотя бы один из них.Требуется только одно из двух текстовых полей (пользовательский валидатор)

Ожидаемый результат: сообщение об ошибке, показали Неожиданные результаты: сообщение об ошибке не показаны

HTML:

<asp:TextBox ID="TB1" runat="server" /> 
<asp:CustomValidator ID="CV1" ControlToValidate="TB1" runat="server" OnServerValidate="blabla" ErrorMessage="one of two required" /> 
<asp:TextBox ID="TB2" runat="server" /> 
<asp:CustomValidator ID="CV2" ControlToValidate="TB2" runat="server" OnServerValidate="blabla" ErrorMessage="they cant both be blank" /> 

C#:

protected void blabla(object sender, ServerValidateEventArgs e) 
{ 
    if (TB1.Text.Length == 0 && TB2.Text.Length == 0) 
     e.IsValid = false; 
    else 
     e.IsValid = true; 
} 

пожалуйста, вы можете помогите объяснить, почему это не ребята?

+0

Что вам нужно делать вкратце .................. ?????? –

+6

Что не работает? Возникает ли событие blabla? Вы получаете исключение? Разве это не так, как вы ожидали? – Belogix

+0

Только один, или хотя бы один? Также объясните, что вы пытаетесь выполнить. – Novak

ответ

5

Вам нужно только один CustomValidator для обоих. Это единственный валидатор, в котором вы можете опустить ControlToValidate для таких случаев.

ASPX:

<asp:TextBox ID="TB1" runat="server" /> 
<asp:TextBox ID="TB2" runat="server" /> 
<asp:CustomValidator ID="CV1"runat="server" 
    OnServerValidate="ServerValidation" 
    ErrorMessage="one of two required" /> 

отделенного кода:

protected void ServerValidation(object source, ServerValidateEventArgs args) 
{ 
    args.IsValid = TB1.Text.Trim().Length > 0 || TB2.Text.Trim().Length > 0; 
} 
+0

. Это отличный человек, спасибо вам большое. – Arshad

+1

+1 Хороший ответ, как всегда Тим. Вы также можете выполнить проверку на стороне клиента. –

1

&& означает and, как и в случае, если обе длины равны 0, то его не действует, попробуйте

bool b = false; 
if (TB1.Text.Length != 0) 
b = true; 

if (TB2.Text.Length != 0) 
b = true; 

e.IsValid = b; 
+0

Примечание: Я предпочитаю ответ Тима, хотя я не поклонник действительно длинный или заявления, поэтому предпочли бы это, если бы были дополнительные текстовые поля для сравнения с – Sayse

0

Попробуйте это:

protected void blabla(object sender, ServerValidateEventArgs e) 
{ 
    if (string.IsNullOrEmpty(TB1.Text) && string.IsNullOrEmpty(TB2.Text)) 
     e.IsValid = false; 
    else 
     e.IsValid = true; 
} 

Кроме того, используя ValidationGroup свойство может быть полезным:

<asp:TextBox ID="TB1" runat="server" /> 
<asp:CustomValidator ID="CV1" ControlToValidate="TB1" runat="server" OnServerValidate="blabla" ErrorMessage="one of two required" validationgroup="validationGroup" /> 
<asp:TextBox ID="TB2" runat="server" /> 
<asp:CustomValidator ID="CV2" ControlToValidate="TB2" runat="server" OnServerValidate="blabla" ErrorMessage="they cant both be blank" validationgroup="validationGroup" /> 

<asp:button id="ValidateButton" text="Validate" validationgroup="validationGroup" runat="server"/> 
+0

Более легко решить с помощью Тима использование только одного customvalidator, но большое спасибо за ваш ответ. – Arshad

Смежные вопросы