簡體   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