ASP.NET: панель обновления с TextBox, которая нуждается в проверке - PullRequest
2 голосов
/ 01 декабря 2011

У меня есть ситуация, когда текстовое поле внутри UpdatePanel для ввода электронной почты должно быть проверено с помощью: - RequiredFieldValidator - RegularExpressionValidator

Каждый из этих валидаторов имеет ValidatorCalloutExtender для вызова сообщения об ошибке вне его UpdatePanel.

У меня есть поиск решения в Интернете, но из моего исследования кажется, что UpdatePanel несовместим с Validator. Я нашел одно решение, которое заключается в создании пользовательского текстового поля onBlur ( Расширение текстового поля asp.net ... ). Однако я бы предпочел более простое решение, которое не требует столько изменений кода.

Вот мой код asp.net:

Электронная почта:

<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Always">
   <ContentTemplate>
      <asp:TextBox ID="txtLoginPageRegisterEmail" runat="server" MaxLength="33" TabIndex="4" BackColor="#DBDBDB" size="40" BorderWidth="0px" AutoPostBack="true" OnTextChanged="txtLoginPageRegisterEmail_TextChanged"></asp:TextBox>
   </ContentTemplate>
   <Triggers>
      <asp:AsyncPostBackTrigger ControlID="txtLoginPageRegisterEmail" />
   </Triggers>
</asp:UpdatePanel>
<asp:RequiredFieldValidator ID="RFVEmail" runat="server" Display="None" ValidationGroup="Registration" ErrorMessage="Email is required." ControlToValidate="txtLoginPageRegisterEmail"></asp:RequiredFieldValidator>
<asp:ValidatorCalloutExtender ID="VCEEmail_ClientState" runat="server" TargetControlID="RFVEmail"></asp:ValidatorCalloutExtender>
<asp:RegularExpressionValidator ID="REVEmail" runat="server" Display="None" ErrorMessage="Please Enter valid Email" ControlToValidate="txtLoginPageRegisterEmail" ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*" ValidationGroup="Registration"></asp:RegularExpressionValidator>
<asp:ValidatorCalloutExtender ID="VCEEmail2_ClientState" runat="server" TargetControlID="REVEmail"></asp:ValidatorCalloutExtender>
<asp:UpdatePanel ID="UpdatePanel2" runat="server">
    <ContentTemplate></ContentTemplate>
</asp:UpdatePanel>

Вот мой код в VB:

Protected Sub txtLoginPageRegisterEmail_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs)
    Dim img As Image = New Image
    If (chkEmail()) Then
        img.ImageUrl = "~/images/login_pg/reg/r.gif"
    Else
        img.ImageUrl = "~/images/login_pg/reg/x.gif"
    End If

    If (String.IsNullOrEmpty(txtLoginPageRegisterEmail.Text)) Then
        UpdatePanel2.ContentTemplateContainer.Controls.Clear()
    Else
        UpdatePanel2.ContentTemplateContainer.Controls.Add(img)
    End If
End Sub

Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load
    ScriptManager.GetCurrent(Me).RegisterAsyncPostBackControl(txtLoginPageRegisterEmail)
End Sub

chkEmail() вызывает хранимую процедуру, чтобы проверить адрес электронной почты и вернуть логическое значение на основе результата.

В первый раз будет отображаться сообщение об ошибке, если я введу неверный адрес электронной почты, но в то же время он отправит и обновит UpdatePanel2, который показывает правильное изображение. После этого очистите текст и снова введите неверный адрес электронной почты. Больше не будет отображаться сообщение об ошибке от валидатора.

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

  1. Пользователь вводит адрес электронной почты внутри текстового поля
  2. Тогда текстовое поле теряет фокус (возможно, используйте событие onTextChange или onBlur с пользовательским методом)
  3. Сначала обратитесь к Валидатору, чтобы он потребовал ввести адрес электронной почты или действительный адрес электронной почты в соответствии с выражением
  4. После успешной проверки будет запущен постбэк к коду, который будет выполнять проверку в базе данных
  5. После проверки результат будет показан с изображением в другой UpdatePanel
  6. Если пользователь очистит текст в текстовом поле, он очистит изображение и не отобразит сообщение об ошибке или просто сообщение об ошибке от RequiredFieldValidator.

1 Ответ

2 голосов
/ 02 декабря 2011

Во-первых, поместите все валидаторы, включая расширители, в панель обновления.

Во-вторых, установите группу валидации в текстовом поле также, поскольку она используется для публикации на сервере, и, наконец, самое главное, установите CausesValidation =true в вашем текстовом поле (по умолчанию false)

Также в примечании не нужно указывать текстовое поле как элемент управления триггером asyncpostback для панели обновления, в которой оно находится. defaut ChildrenAsTriggers имеет значение true, если обратные вызовыот детей, это приведет к обновлению панели обновления.

тьфу, у меня ушло около 1 часа, чтобы понять, что в качестве причины проверки было установлено значение false, и я сказал «почему это не работает?»

...