2014-11-01 125 views
1

我試圖讓一個CustomValidator調用一個服務器方法(這是一個校驗和,我認爲它是正確的,但你會看到我無法真正知道),但它永遠不會被調用,我可以在文本框中輸入任何內容,並且從不出現錯誤消息,並且在該方法中添加一個斷點表明它根本不會被調用,無論文本框中輸入了什麼內容。我是否也需要客戶端驗證?ASP.NET - 驗證自定義驗證器

我的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> 

的C#代碼隱藏:

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 2014-11-01 14:46:54

回答

1

如果你從來沒有回發到你的服務器端驗證將不會稱爲服務器。您可能需要進行一些客戶端驗證,以便您的用戶無需提交表單即可獲取驗證結果。

這MSDN文章有同時使用服務器端和客戶端驗證的例子: CustomValidator Example

我用你的標記和代碼後面,它似乎工作。

標記:

<%@ 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> 

代碼隱藏:

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 2014-11-01 15:18:57

+0

@ user2966419'Page.IsValid'只檢查驗證結果,不執行驗證。 「ServerValidate」事件處理程序將在按鈕的「Click」處理程序之前被調用。 – Dave 2014-11-02 17:09:44