2013-10-16 95 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(); 
} 
相关问题