2016-03-22 29 views
0

我想在插入時驗證gridview列以防止重複。網格有分頁,所以我必須去數據庫檢查這個字段中的所有值。返回時,如果值存在,我想將錯誤消息設置爲'UserID exists'。GridView自定義驗證器無法設置從Ajax調用返回後的innerHTML

我的問題是當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函數調用以驗證用戶名存在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對象爲空。我在進入數據庫之前如何保存這些內容? 還是有更好的方法來檢查存在?

+0

看看這個:http://stackoverflow.com/questions/3636228/asp-net-custom-validator-how-to-get-the-controltovalidate-property-on-clientv – Zaki

+0

這不是我的問題。在進行.ajax調用之前,我可以識別發件人。當它從服務器返回時,'sender'和'args'爲空。我嘗試在ajax調用之前將'sender和'args'對象保存在變量中,所以在成功函數中,我可以設置'IsValid'和'innerHTML'屬性,但這也不起作用。 –

回答

0

我得到了這個工作。如果其他人需要進行客戶端驗證並向服務器進行數據庫調用。 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。

相關問題