我想在插入時驗證gridview列以防止重複。網格有分頁,所以我必須去數據庫檢查這個字段中的所有值。返回時,如果值存在,我想將錯誤消息設置爲'UserID exists'。GridView自定義驗證器無法設置從Ajax調用返回後的innerHTML
我的問題是當WebMethod
與結果一起返回時,我無法訪問參數sender
或args
。當我在success
函數中設置警報時,該值爲空。
當您必須返回數據庫時,這是驗證重複項的最佳方法嗎?如果是這樣,我如何保存sender
和args
參數,以便觸發自定義驗證。
這是我的標記:
<div id="UsersGridWrapper" runat="server">
<asp:UpdatePanel ID="UpdatePanelUserData" runat="server">
<ContentTemplate>
<asp:GridView ID="UserInfoGridView" runat="server" AllowPaging="True" PageSize="15">
<Columns>
<asp:TemplateField HeaderText="UserID">
<HeaderTemplate> UserID
<asp:ImageButton ID="senigvUserIDFilter" runat="server" ImageUrl="Images/filter.png" OnClientClick="return ShowHideFilterTxtBox('senigvTxtUserIDFilter')" />
<asp:TextBox ID="senigvTxtUserIDFilter" runat="server" AutoPostBack="true" style="display:none;" ClientIDMode="Static" OnTextChanged="senigvGridFilter_TextChanged">
</asp:TextBox>
</HeaderTemplate>
<ItemTemplate>
<asp:Label ID="senigvLblUserID" runat="server" Text='<%# Bind("UserID") %>' ></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:Label ID="senigvLblEditUserID" runat="server" Text='<%# Bind("UserID") %>' ></asp:Label>
</EditItemTemplate>
<FooterTemplate>
<asp:TextBox ID="senigvTxtBxInsertUserID" runat="server" Text='<%# Bind("UserID") %>' ClientIDMode="Static"></asp:TextBox>
<asp:RequiredFieldValidator ID="senigvRequiredFieldInsertUserID" ControlToValidate="senigvTxtBxInsertUserID" runat="server"
ErrorMessage="Required field." ValidationGroup="InsertSenderValidation" Display="Dynamic" CssClass="message-error">
</asp:RequiredFieldValidator>
<asp:RegularExpressionValidator ID="senigvMaxValInsertUserID" ControlToValidate="senigvTxtBxInsertUserID" runat="server"
ErrorMessage="Maximumn length is 40." ValidationGroup="InsertSenderValidation" Display="Dynamic" CssClass="message-error"
ValidationExpression="^.{1,40}$" >
</asp:RegularExpressionValidator>
<asp:CustomValidator ID="senigvCustomInsertUserID" ControlToValidate="senigvTxtBxInsertUserID" runat="server"
ValidationGroup="InsertSenderValidation" Display="Dynamic" CssClass="message-error"
ErrorMessage="*" ClientValidationFunction="ValidateUserID" EnableClientScript="true">
</asp:CustomValidator>
</FooterTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</ContentTemplate>
</asp:UpdatePanel>
</div>
這是一個自定義的驗證過程中調用jQuery函數:
function ValidateUserID(sender, args) {
var EnteredUserID = args.Value;
//Call to database to check if UserID exists
$.ajax({
type: "POST",
url: "EditUsers.aspx/DoesUserIDExist",
data: JSON.stringify({ strUserID: EnteredUserID }),
contentType: "application/json; charset=utf-8",
datatype: "json",
success: function (data, sender, args) {
if (data.d == true) {
args.IsValid = false;
sender.innerHTML = "UserID exists.";
}
else {
args.IsValid = true;
sender.innerHTML = "";
}
return;
},
error: function (exception, sender, args) {
args.IsValid = false;
sender.innerHTML = "";
$("#senigvTxtBxInsertUserID").val("");
alert('An error occurred while calculating the message length: ' + exception.toString());
}
});
};
是從jQuery函數調用以驗證用戶名存在C#的方法:
[System.Web.Services.WebMethod]
public static bool DoesUserIDExist(string strUserID)
{
bool tbUserIDExist = false;
PagingService.PagingClient tpagingClient = new PagingService.PagingClient();
string tstrXmlTableData = tpagingClient.CheckUserID(strUserID);
DataTable tdtUserID = CommonMethods.ParseXML(tstrXmlTableData);
if ((tdtUserID != null) && (tdtUserID.Rows.Count > 0))
{
string tstrUserID = tdtUserID.Rows[0]["UserID"].ToString();
if (!string.IsNullOrEmpty(tstrUserID))
{
tbUserIDExist = true;
}
}
return tbUserIDExist;
}
jquery函數被調用,並正確地確定是否我們erID是否存在於數據庫中。
我的問題是在success
函數中,sender
對象爲空。我在進入數據庫之前如何保存這些內容? 還是有更好的方法來檢查存在?
看看這個:http://stackoverflow.com/questions/3636228/asp-net-custom-validator-how-to-get-the-controltovalidate-property-on-clientv – Zaki
這不是我的問題。在進行.ajax調用之前,我可以識別發件人。當它從服務器返回時,'sender'和'args'爲空。我嘗試在ajax調用之前將'sender和'args'對象保存在變量中,所以在成功函數中,我可以設置'IsValid'和'innerHTML'屬性,但這也不起作用。 –