1

我正在尝试通过 javascript 函数进行客户端验证。我有一个 ASP.NET c# 页面,它成功调用了一个 WebMethod(从后面的页面代码)来验证用户可以访问输入的数据。我有一个带有 AJAX AutoCompleteExtender 的文本框,它工作正常。我有我正在尝试调用 javascript 函数来验证数据的 CustomValidator。Web 方法(从 SQL 数据库中提取)正在按预期执行并返回数据。Javascript 正在执行 web 方法。问题是 PageMethods 正在使用“OnSuccess”函数(来自被调用的 javascript 函数的嵌套函数)但是从 OnScuess 函数我无法设置 args.IsValid = true/false。我可以在原始函数中设置此属性,但为了做到这一点,我需要两个 args。OnSuccess 的值和结果,以评估它是否有效。两者都无法相互访问。我尝试过隐藏字段来设置要评估的值,我尝试过 JavaScript 中的“全局”变量。似乎没有什么能给我想要的结果。在评估设置 args.IsValid 之前,隐藏字段和“全局”变量都没有设置。有人可以帮忙吗。我无法相信如此简单的任务变得如此困难。显示验证错误消息的唯一方法是,如果我手动设置 args.IsValid 并在 javascript 主函数的底部发出警报(“与我在此处输入的内容无关”)。我不想要警报,我只想在我的文本框旁边显示一条消息。

我知道一个简单的解决方案是有一个下拉列表,但也有服务器端验证,但这不是我需要的。

这是我的javascript函数

function pmValidateGLAccount(oSrc, args) {
    var GLIsValid;
    PageMethods.ValidateGLAccountAccess(args.Value, OnSuccess);
    function OnSuccess(result) {
        // I NEED TO DETERMINE IF IS VALID BUT SET THE args.IsValid after the process leaves this nested function
        if (args.Value != result) {
            GLIsValid = false;
        }
        else {
            GLIsValid = true;
        };
    };// THIS IS THE END OF THE ONSUCCESS FUNCTION
    //args.IsValid = false; //THIS IS WHERE WE NEED TO SET THE IsValid

} // THIS IS THE END OF THE pmValidateGLAccount FUNCTION

这是我的 CustomValidator

<asp:CustomValidator ID="CustomValidator1" 
runat="server" 
ControlToValidate="TextBox1"  
ValidationGroup="vg_test" 
ClientValidationFunction="pmValidateGLAccount" 
ErrorMessage="Error: Please Enter an Account Number from the list" 
Display="Dynamic"></asp:CustomValidator>

这是我的网络方法

[System.Web.Services.WebMethod(), System.Web.Script.Services.ScriptMethod()]
public static string ValidateGLAccountAccess(string GLAccountNum)
{

    string RetValue = string.Empty;
    string CurUser = HttpContext.Current.User.Identity.Name.ToString();
    string CurUserRemoveDomain = string.Empty;
    int i = CurUser.IndexOf("\\");
    if (i != -1)
    {
        CurUserRemoveDomain = CurUser.ToLower().Replace(Resources.AppSettings.ActiveDirectoryDomain.ToString().ToLower() + "\\", "");
        CurUser = CurUserRemoveDomain;
    }

    using (SqlConnection conn = new SqlConnection())
    {
        conn.ConnectionString = ConfigurationManager.ConnectionStrings["CustDBConn"].ConnectionString;
        using (SqlCommand cmd = new SqlCommand("MySproc", conn))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("@SearchString", GLAccountNum);
            cmd.Parameters.AddWithValue("@UserName", CurUser);
            cmd.Connection = conn;
            conn.Open();
            RetValue = (string)cmd.ExecuteScalar();
            conn.Close();
        }
    }
    return RetValue;
}
4

2 回答 2

2

好的,对于那些仍在使用同步客户端验证解决方案的人来说。我终于得到了解决方案。我不愿意尝试 jQuery,但希望我能在几天前​​尝试。

我试图完成的是一个文本框自动完成功能,它将用户名传递给数据库并开始返回特定于该用户的数据。然后,为了防止文本框中除了允许的自动完成列表之外的任何输入,我使用了带有 jQ​​uery 的 CustomValidator。这样做是将最终输入字符串与用户名一起传递给数据库。如果数据库返回匹配字符串的记录,则选择有效;如果不是,则选择被标记为无效。

我为此奋斗了这么久,我想给别人一个“尽可能完整”的指南。对于那些没有使用过 jQuery 的人,我之前也没有使用过,而这部分花费了最少的时间来提出这个解决方案。我希望这可以帮助那里的人。

这正是我所做的:

  1. 下载 jQuery 脚本并将其放在我的脚本文件夹中。在我的 MasterPage.Master 标题部分中添加了对 jQuery 的引用。将 ScriptManager(在正文中)修改为 EnablePageMethods。

    <script type="text/javascript" src="/scripts/jquery-1.4.2.js"></script> 
    
    <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true">
    </asp:ScriptManager>
    
  2. 在 TextBoxAutoFill.aspx 的内容占位符中添加了 JavaScript。

    <script type="text/javascript">
        function pmValidateGLAccount(oSrc, args) {
            $.ajax({
                type: "POST",
                async: false,
                url: "TextBoxAutoFill.aspx/ValidateGLAccountAccess",
                data: "{ GLAccountNum: " + "'" + args.Value + "' }",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function (response) { args.IsValid = response.d; }
            });
        }; 
    </script>
    
  3. 创建了我的 TextBox、AutoCompleteExtender 和 CustomValidator

    <asp:TextBox TabIndex="1" autocomplete="off" ID="TextBox1" runat="server" Width="250px" ValidationGroup="vg_test"></asp:TextBox>
     <asp:AutoCompleteExtender ID="TextBox1_AutoCompleteExtender" 
         runat="server" 
         EnableCaching="true"
         CompletionSetCount="10"
         ShowOnlycurrentWordInCompletionListItem="true"
         CompletionInterval="500" 
         CompletionListCssClass="AJAXAutosuggestTextBox" 
         DelimiterCharacters="" 
         Enabled="True" 
         ServiceMethod="GetAccountNumbers" 
         TargetControlID="TextBox1" 
         MinimumPrefixLength="4"
         >
    </asp:AutoCompleteExtender>
    <asp:CustomValidator ID="CustomValidator1" 
        runat="server" 
        ControlToValidate="TextBox1"  
        ValidationGroup="vg_test" 
        ClientValidationFunction="pmValidateGLAccount" 
        ErrorMessage="Error: Please enter an account number from the list" 
        Display="Dynamic"></asp:CustomValidator>
    
  4. 为我的 AutoCompleteExtender 添加了 WebMethod(在 TestBoxAutoFill.aspx.cs 文件中)

    [System.Web.Services.WebMethod(), System.Web.Script.Services.ScriptMethod()]
    public static List<string> GetAccountNumbers(string prefixText, int count)
    {
        string CurUser = HttpContext.Current.User.Identity.Name.ToString();
        string CurUserRemoveDomain = string.Empty;
        int i = CurUser.IndexOf("\\");
        if (i != -1)
        {
            CurUserRemoveDomain = CurUser.ToLower().Replace(Resources.AppSettings.ActiveDirectoryDomain.ToString().ToLower() + "\\", "");
            CurUser = CurUserRemoveDomain;
        }
    
        using (SqlConnection conn = new SqlConnection())
        {
            conn.ConnectionString = ConfigurationManager.ConnectionStrings["CustDBConn"].ConnectionString;
            using (SqlCommand cmd = new SqlCommand("SP_PCard_Get_AutoCompleteAccountNumbers", conn))
            {
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@RecCount", count);
                cmd.Parameters.AddWithValue("@SearchString", prefixText);
                cmd.Parameters.AddWithValue("@UserName", CurUser);
                cmd.Connection = conn;
                conn.Open();
                List<string> AccountNumbers = new List<string>();
                using (SqlDataReader sdr = cmd.ExecuteReader())
                {
                    while (sdr.Read())
                    {
                        AccountNumbers.Add(sdr["ACTNUMST"].ToString());
                    }
                }
                conn.Close();
                return AccountNumbers;
            }
        }
    }
    
  5. 添加了用于验证的 WebMethod(位于 TestBoxAutoFill.aspx.cs 文件中)

    [System.Web.Services.WebMethod(), System.Web.Script.Services.ScriptMethod()]
    public static bool ValidateGLAccountAccess(string GLAccountNum)
    {
        string RetValue = string.Empty;
        string CurUser = HttpContext.Current.User.Identity.Name.ToString();
        string CurUserRemoveDomain = string.Empty;
        int i = CurUser.IndexOf("\\");
        if (i != -1)
        {
            CurUserRemoveDomain = CurUser.ToLower().Replace(Resources.AppSettings.ActiveDirectoryDomain.ToString().ToLower() + "\\", "");
            CurUser = CurUserRemoveDomain;
        }
        using (SqlConnection conn = new SqlConnection())
        {
            conn.ConnectionString = ConfigurationManager.ConnectionStrings["CustDBConn"].ConnectionString;
            using (SqlCommand cmd = new SqlCommand("SP_PCard_Get_SelectedGLAcountNumber", conn))
            {
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@SearchString", GLAccountNum);
                cmd.Parameters.AddWithValue("@UserName", CurUser);
                cmd.Connection = conn;
                conn.Open();
                RetValue = (string)cmd.ExecuteScalar();
                conn.Close();
            }
        }
        Boolean myVarBool = false;
        if (RetValue == GLAccountNum)
        {
            myVarBool = true;
        }
        return myVarBool;
    }
    
于 2013-10-29T00:46:27.900 回答
0

嗯,我在 .NET C# 上玩的不多,但通常我只是将 JQuery 验证和 AJAX 用于 Web 应用程序。

我试着回答你的问题,我不能尝试..但可能会有点帮助:

  1. 请确保 PageMethods.ValidateGLAccountAccess(args.Value, OnSuccess); 返回正确的结果?

  2. 尝试此代码并在尝试此代码后使用 alert(args.IsValid) 对其进行调试:

    function pmValidateGLAccount(oSrc, args) {
    var GLIsValid;
    args.IsValid =false;
    PageMethods.ValidateGLAccountAccess(args.Value, OnSuccess);
    function OnSuccess(result) {            
        if (args.Value != result) {
            GLIsValid = false; // or you don't need this
            args.IsValid= false;
            alert(args.IsValid);
        }
        else {
            GLIsValid = false; // or you don't need this
            args.IsValid= true;
            alert(args.IsValid);
        }
    } 
    

    }

  3. 对不起,如果这不是你的意思,但如果你需要得到它..你可以把“var GLIsValid;” 在函数之外作为全局变量..如果您在该函数上定义,则意味着可以在该函数包装上访问。谢谢你

于 2013-10-26T07:09:44.013 回答