繁体   English   中英

asp.net/JavaScript ClientSide CustomValidation WebMethod

[英]asp.net / JavaScript ClientSide CustomValidation WebMethod

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

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

这是我的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;
}

好吧,对于仍在使用同步客户端验证解决方案的解决方案的人。 我终于找到了解决方案。 我不愿尝试使用jQuery,但希望我能在几天前​​完成。

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

我为此花了很长时间,我想给别人一个“尽可能完整”的指南。 对于那些没有使用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; } 

嗯,我对.NET C#的使用并不多,但是通常我只对Web应用程序使用JQuery验证和AJAX。

我尝试回答您的问题,我无法尝试..但可能会有所帮助:

  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;”。 在函数外部作为全局变量..如果您在该函数上定义,则意味着可以对该函数包装进行访问。 谢谢

暂无
暂无

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

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