简体   繁体   English

ASP.NET-验证CustomValidator

[英]ASP.NET - Validating a CustomValidator

I'm trying to get a CustomValidator to call a server method (it's a checksum, I think it's right but as you'll see I can't really tell) but it's never called, I can enter anything into the text box and the error message never appears, and adding a break-point in the method reveals that it's never called at all not matter what's entered in the text box. 我正在尝试让CustomValidator调用服务器方法(这是一个校验和,我认为这是正确的,但是正如您所看到的,我无法真正分辨出来),但是它从未被调用,我可以在文本框中输入任何内容,然后错误消息永远不会出现,并且在该方法中添加断点表明,无论在文本框中输入什么内容,都不会调用它。 Do I need client-side validation too? 我也需要客户端验证吗?

My OnServerValidate looks to be calling the method correctly to my eyes - I really am at a loss here. 我的OnServerValidate看上去在我眼中正确地调用了该方法-我真的很茫然。 Help much appreciated! 帮助非常感谢!

The ASP.Net code: 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>

The c# code-behind: 后面的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;
        }
    }

If you never post back to the server your server side validation will not get called. 如果您从不回发到服务器,则不会调用服务器端验证。 You may want to put in some client side validation so your users don't need to submit the form to get their validation results. 您可能需要进行一些客户端验证,因此您的用户无需提交表单即可获得验证结果。

This MSDN article has an example of using both server side and client side validation: CustomValidator Example 此MSDN文章提供了同时使用服务器端和客户端验证的示例CustomValidator示例

I used your markup and code-behind and it seems to work. 我使用了您的标记和代码隐藏功能,它似乎可以正常工作。

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-behind: 代码隐藏:

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");
            }
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM