【发布时间】:2016-03-22 16:40:32
【问题描述】:
我想在插入时验证 gridview 列以防止重复。网格有分页,所以我必须去数据库检查这个字段中的所有值。返回时,如果值存在,我想将错误消息设置为“用户 ID 存在”。
我的问题是当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 函数调用以验证 UserID 是否存在的 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函数并正确判断数据库中是否存在UserID。
我的问题是在success 函数中,sender 对象为空。在进入数据库之前如何保存它?
或者有没有更好的方法来检查是否存在?
【问题讨论】:
-
这不是我的问题。在进行 .ajax 调用之前,我可以识别发件人。当它从服务器返回时,
sender和args为空。我尝试在 ajax 调用之前将sender andargs` 对象保存在变量中,因此在成功函数中,我可以设置IsValid和innerHTML属性,但这也不起作用。
标签: jquery asp.net validation gridview