[英]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的人,我之前也沒有使用過,而那部分花費最少的時間來提出此解決方案。 我希望這可以幫助某個人。
這正是我所做的:
下載了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>
在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>
創建了我的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>
為我的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; } } }
添加了用於驗證的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。
我嘗試回答您的問題,我無法嘗試..但可能會有所幫助:
請確保PageMethods.ValidateGLAccountAccess(args.Value,OnSuccess); 返回正確的結果?
嘗試以下代碼后,嘗試使用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); } }
}
抱歉,這不是您的意思,但是如果您需要得到它,您可以輸入“ var GLIsValid;”。 在函數外部作為全局變量..如果您在該函數上定義,則意味着可以對該函數包裝進行訪問。 謝謝
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.