2013-10-16 94 views
1

你好,我的項目有問題。當我提交一個creditcardnumber時,程序通常應該跳到我的servervalidation中,執行我的if語句中的命令並跳轉到兩個bool方法中,但程序只是通過if語句並跳轉到submitbutton方法來顯示結果。我做錯了什麼?爲什麼我的asp.net頁面不使用我的c#方法?

此服務器的代碼:

protected void SubmitMidtermBtn_Click(object sender, EventArgs e) 
{ 
    this.OnMidtermInfoCollected();   
}  

public void ServerValidation(object source, ServerValidateEventArgs args) 
{  
    if (CardType(args.Value, CreditCardType.Text) && IsCreditCardValid(args.Value)) 
    { 
     args.IsValid=true; 
    } 
    else 
    { 
     args.IsValid=false; 
    } 
} 

public bool CardType(string cardNumber, string cardType) 
{ 
    if (cardType.Equals("VISA")) 
    { 
     if (cardNumber.Length == 14 || cardNumber.Length == 16 && 
      (cardNumber.StartsWith("4"))) 
     { 
      return true; 
     }   
    } 
    if (cardType.Equals("Mastercard")) 
    { 
     if (cardNumber.Length == 16 && 
      cardNumber.StartsWith("51") || 
      cardNumber.StartsWith("52") || 
      cardNumber.StartsWith("53") || 
      cardNumber.StartsWith("54") || 
      cardNumber.StartsWith("55")) 
     { 
      return true; 
     } 
    } 
    if (cardType.Equals("AmericanExpress")) 
    { 
     if (cardNumber.Length == 15 && 
      cardNumber.StartsWith("34") || 
      cardNumber.StartsWith("37")) 
     { 
      return true; 
     } 
    } 
    if (cardType.Equals("Discover")) 
    { 
     if (cardNumber.Length == 16 && 
      cardNumber.StartsWith("601")) 
     { 
      return true; 
     } 
    } 

    return false; 
} 

public bool IsCreditCardValid(string cardNumber) 
{   
    int i; 
    StringBuilder cleanNumber = new StringBuilder(); 

    for (i = cleanNumber.Length + 1; i <= 16; i++) 
     cleanNumber.Insert(0, "0"); 

    int multiplier, digit, sum, total = 0; 
    string number = cleanNumber.ToString(); 

    for (i = 1; i <= 16; i++) 
    { 
     multiplier = 1 + (i % 2); 
     digit = int.Parse(number.Substring(i - 1, 1)); 
     sum = digit * multiplier; 
     if (sum > 9) 
      sum -= 9; 
     total += sum; 
    } 

    return (total % 10 == 0); 
} 

這件事情不要搭上末結束標記,應該是在這個地方

此時服務器驗證應被激活:

<asp:CustomValidator ID="CreditcardValidation" 
    ControlToValidate="CreditCardNumber" 
    OnServerValidate="ServerValidation" 
    ErrorMessage="" 
    runat="server" Display="Dynamic"> 
     <div class="alert alert-danger">Please enter a valid creditcard number</div> 
</asp:CustomValidator> 

有人可以幫我嗎?

+1

我懷疑你會得到很多幫助,直到你縮小你的問題。很少有人會閱讀所有的代碼。 –

+0

好吧,我只是將它縮短到不真正工作的方法。 – user2157063

+1

您是否需要手動檢查來觸發像這樣的自定義服務器驗證? 'if(!Page.IsValid){return; }'在你的按鈕事件處理程序中。 –

回答

0

查看頁面事件lifecycle

如果您仔細閱讀,您會發現點擊事件的事件處理程序在隱式調用page.Validate()之前觸發,這是引發服務器驗證事件的方法。當你點擊處理程序被調用時,驗證程序還沒有結束。

如果請求是回發,則調用控件事件處理程序。之後,調用所有驗證器控件的Validate方法,該方法設置單個驗證器控件和頁面的IsValid屬性。 (此序列有一個例外:導致驗證的事件的處理程序在驗證後調用。)

如果您想在早期觸發page.Validate(),只需顯式調用它。

protected void SubmitMidtermBtn_Click(object sender, EventArgs e) 
{ 
    this.Validate(); 
    this.OnMidtermInfoCollected(); 
} 
相關問題