2014-11-01 4 views
1

Я пытаюсь получить CustomValidator для вызова метода сервера (это контрольная сумма, я думаю, что это правильно, но, как вы увидите, я не могу сказать), но она никогда не называется, Я могу ввести что-либо в текстовое поле, и сообщение об ошибке никогда не появляется, и добавление точки останова в методе показывает, что он никогда не вызывается вообще неважно, что введено в текстовое поле. Нужно ли мне также проверять на стороне клиента?ASP.NET - Проверка CustomValidator

My OnServerValidate считает, что метод корректно называет мои глаза - я действительно здесь не понимаю. Помогите оценить!

ASP.Net код:

<asp:Label ID="lblPPSN" runat="server" Text="PPS number: "></asp:Label> 
    <asp:TextBox ID="tbxPPSN" runat="server"></asp:TextBox> 
    <asp:CustomValidator ID="customval_PPSN" runat="server" ErrorMessage="Please enter a valid PPSN" ControlToValidate="tbxPPSN" 
     OnServerValidate="customval_PPSN_ServerValidate" ForeColor="Red"></asp:CustomValidator> 

С # кода:

protected void customval_PPSN_ServerValidate(object source, ServerValidateEventArgs args) 
    { 
     string checkChar = "", formatChar = "", input = tbxPPSN.Text; 
     bool newFormat = false; 

     if (input.Length > 9) 
     { 
      args.IsValid = false; 
      return; 
     } 

     if (input.Length == 9) 
     { 
      newFormat = true; 
     } 

     char[] PPSArray = input.ToCharArray(); 
     Array.Reverse(PPSArray); 
     checkChar = PPSArray[0].ToString(); 

     if (newFormat) 
     { 
      checkChar = PPSArray[1].ToString(); 
      formatChar = PPSArray[0].ToString(); 
     } 

     checkChar = checkChar.ToLower(); 
     formatChar = formatChar.ToLower(); 

     int seed = 2, PPSParsed = 0, PPSsum = 0, PPSMod = 0; 

     foreach (char ppschar in PPSArray) 
     { 
      if (int.TryParse(ppschar.ToString(), out PPSParsed)) 
      { 
       PPSsum += PPSParsed * seed; 
       seed++; 
      } 
     } 

     if (newFormat) 
     { 
      PPSsum += Convert.ToInt32(formatChar.ToCharArray()[0] - 96) * 9; 
     } 

     PPSMod = PPSsum % 23; 

     if (PPSMod == 0) PPSMod = 23; 

     if (Convert.ToString((char) (96 + PPSMod)).ToLower() == checkChar) 
     { 
      args.IsValid = true; 
      return; 
     } 
     else 
     { 
      args.IsValid = false; 
     } 
    } 
+0

Хм, это выглядит действительным на первый взгляд. Вы уверены, что его не ударили? Вы отлаживаете это в Visual Studio, и если да, то можете ли вы попробовать 'System.Diagnostics.Debug.WriteLine()' в начале метода, чтобы узнать, выводит ли он что-либо в окно вывода? У вас есть какие-либо группы ValidationGroups, созданные на элементах вашей кнопки или формы, которые могут привести к игнорированию этого валидатора? Вам не нужно проверять на стороне клиента; это просто удобная опция. – trnelson

ответ

1

Если вы никогда не отправлять обратно на сервер вашей проверки на стороне сервера не будет вызван. Возможно, вы захотите выполнить некоторую проверку на стороне клиента, чтобы ваши пользователи не нуждались в отправке формы для получения результатов проверки.

В этой статье MSDN есть пример использования как на стороне сервера и на стороне клиента проверки: CustomValidator Example

я использовал разметку и код-сзади и это, кажется, работает.

Markup:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Val.aspx.cs" Inherits="CustomValidatorExample.Val" %> 

<!DOCTYPE html> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
     <div> 
      <asp:Label ID="lblPPSN" runat="server" Text="PPS number: "></asp:Label> 
      <asp:TextBox ID="tbxPPSN" runat="server"></asp:TextBox> 
      <asp:CustomValidator ID="customval_PPSN" runat="server" ErrorMessage="Please enter a valid PPSN" ControlToValidate="tbxPPSN" 
       OnServerValidate="customval_PPSN_ServerValidate" ForeColor="Red"></asp:CustomValidator> 
      <asp:Button runat="server" ID="button1" Text="Validate" OnClick="button1_Click" /> 
     </div> 
    </form> 
</body> 
</html> 

Code-за:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

namespace CustomValidatorExample 
{ 
    public partial class Val : System.Web.UI.Page 
    { 
     protected void customval_PPSN_ServerValidate(object source, ServerValidateEventArgs args) 
     { 
      string checkChar = "", formatChar = "", input = tbxPPSN.Text; 
      bool newFormat = false; 

      if (input.Length > 9) 
      { 
       args.IsValid = false; 
       return; 
      } 

      if (input.Length == 9) 
      { 
       newFormat = true; 
      } 

      char[] PPSArray = input.ToCharArray(); 
      Array.Reverse(PPSArray); 
      checkChar = PPSArray[0].ToString(); 

      if (newFormat) 
      { 
       checkChar = PPSArray[1].ToString(); 
       formatChar = PPSArray[0].ToString(); 
      } 

      checkChar = checkChar.ToLower(); 
      formatChar = formatChar.ToLower(); 

      int seed = 2, PPSParsed = 0, PPSsum = 0, PPSMod = 0; 

      foreach (char ppschar in PPSArray) 
      { 
       if (int.TryParse(ppschar.ToString(), out PPSParsed)) 
       { 
        PPSsum += PPSParsed * seed; 
        seed++; 
       } 
      } 

      if (newFormat) 
      { 
       PPSsum += Convert.ToInt32(formatChar.ToCharArray()[0] - 96) * 9; 
      } 

      PPSMod = PPSsum % 23; 

      if (PPSMod == 0) PPSMod = 23; 

      if (Convert.ToString((char)(96 + PPSMod)).ToLower() == checkChar) 
      { 
       args.IsValid = true; 
       return; 
      } 
      else 
      { 
       args.IsValid = false; 
      } 
     } 

     protected void button1_Click(object sender, EventArgs e) 
     { 
      if (Page.IsValid) 
      { 
       Response.Write("Valid"); 
      } 
     } 
    } 
} 
+0

У меня есть кнопка встречи на высшем уровне, когда при нажатии кнопки «Проверить» ((Page.IsValid)) не должно обрабатывать то, что я хочу сделать правильно? – StolenSheep

+0

@ user2966419 'PageIsValid' проверяет только результаты проверки, он не выполняет проверку. Обработчик события ServerValidate будет вызван до нажатия кнопки 'Click'. – Dave

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