【问题标题】:ASP.NET - Validating a CustomValidatorASP.NET - 验证 CustomValidator
【发布时间】:2014-11-01 14:41:19
【问题描述】:

我正在尝试让 CustomValidator 调用服务器方法(这是一个校验和,我认为它是正确的,但正如你所看到的,我真的无法判断)但它从未被调用,我可以在文本中输入任何内容框和错误消息永远不会出现,并且在方法中添加断点表明它根本不会被调用,无论在文本框中输入什么。我还需要客户端验证吗?

在我看来,我的 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;
        }
    }

【问题讨论】:

  • 嗯,乍一看似乎有效。你确定它没有被击中?您是否在 Visual Studio 中对此进行调试,如果是这样,您可以在方法的开头尝试System.Diagnostics.Debug.WriteLine() 以查看它是否将任何内容输出到“输出”窗口?您是否在按钮或表单元素上设置了任何可能导致此验证器被忽略的 ValidationGroups?您不需要客户端验证;这只是一个方便的选择。

标签: c# asp.net customvalidator


【解决方案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");
            }
        }
    }
}

【讨论】:

  • 我有一个峰会按钮,单击该按钮时会检查 If (Page.IsValid) - 这不应该处理我想要正确执行的操作吗?
  • @user2966419 Page.IsValid 只检查验证结果,不执行验证。 ServerValidate 事件处理程序将在按钮的Click 处理程序之前被调用。
猜你喜欢
  • 2018-10-20
  • 2010-10-03
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多