【问题标题】:Gridview Custom Validator cannot set innerHTML after returning from ajax call从 ajax 调用返回后,Gridview 自定义验证器无法设置 innerHTML
【发布时间】:2016-03-22 16:40:32
【问题描述】:

我想在插入时验证 gridview 列以防止重复。网格有分页,所以我必须去数据库检查这个字段中的所有值。返回时,如果值存在,我想将错误消息设置为“用户 ID 存在”。

我的问题是当WebMethod 返回结果时,我无法访问参数senderargs。当我在success 函数中设置警报时,该值为空。

当您必须返回数据库时,这是验证重复项的最佳方式吗?如果是这样,如何保存senderargs 参数以便触发自定义验证。

这是我的标记:

<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 调用之前,我可以识别发件人。当它从服务器返回时,senderargs 为空。我尝试在 ajax 调用之前将 sender and args` 对象保存在变量中,因此在成功函数中,我可以设置 IsValidinnerHTML 属性,但这也不起作用。

标签: jquery asp.net validation gridview


【解决方案1】:

我得到了这个工作。万一其他人需要进行客户端验证并对服务器进行数据库调用.. 1.在函数中添加了一个变量来保存服务端调用方法的结果 2.使用变量设置args.IsValid函数。 3. 不需要设置innerHTML。在标记中设置错误消息。如果isValid 为假,则显示。 最终标记:

<asp:CustomValidator ID="senigvCustomInsertUserID" ControlToValidate="senigvTxtBxInsertUserID" runat="server" 
                        ValidationGroup="InsertSenderValidation" Display="Dynamic" CssClass="message-error"
                        ErrorMessage="UserID exists." ClientValidationFunction="ValidateUserID"  ValidateEmptyText="false" EnableClientScript="true">
</asp:CustomValidator>

最终的jquery函数:

function ValidateUserID(sender, args) {
        var EnteredUserID = args.Value;
        var isValid;

        //Call to database to check if UserID exists
        $.ajax({
            async: false,
            type: "POST",
            url: "EditUsers.aspx/DoesUserIDExist",
            data: JSON.stringify({ strUserID: EnteredUserID }),
            contentType: "application/json; charset=utf-8",
            datatype: "json",
            success: function (data) {
                isValid = data.d;
            },
            error: function (exception) {
                $("#senigvTxtBxInsertUserID").val("");
                alert('An error occurred while calculating the message length: ' + exception.toString());
            }
        });
        args.IsValid = isValid;
    };

服务器方法调用保持不变。 如果 valid 设置为 true,则返回的布尔值;如果无效则设置为 false。

【讨论】:

    猜你喜欢
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 2014-04-05
    • 2013-09-09
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多