2016-03-22 9 views
0

重複を防ぐために挿入するときにgridview列を検証したいと思います。グリッドにはページングがあるので、このフィールドのすべての値をチェックするためにデータベースに移動しなければなりません。復帰時に、値が存在する場合、エラーメッセージを 'UserID exists'に設定したいと思います。Gridviewカスタムバリデーターは、ajax呼び出しから返された後にinnerHTMLを設定できません。

私の問題は、WebMethodが結果を返し、パラメータにアクセスできない場合です。senderまたはargsです。 success関数でアラートを設定すると、値はnullになります。

これは、データベースに戻ったときに重複を検証する最も良い方法ですか?その場合は、senderargsのパラメータを保存してカスタム検証がトリガーされるようにするにはどうすればよいですか。

これは私のマークアップです:

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()); 
    } 
}); 
}; 

ユーザーIDの存在を検証するためにjqueryの関数から呼び出されたC#の方法:

<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の関数です。

[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関数が呼び出され、Us erIDがデータベース内に存在するかどうか。

私の問題は、success関数では、senderオブジェクトがnullであることです。データベースに行く前にこれを保存するにはどうしたらいいですか? 存在を確認するためのより良いアプローチがありますか?

+0

これを見てください:http://stackoverflow.com/questions/3636228/asp-net-custom-validator-how-to-get-the-controltovalidate-property-on-clientv – Zaki

+0

私の問題ではありません。私は.ajax呼び出しを行う前に送信者を特定できます。サーバから戻ってくると、 'sender'と' args'はnullです。私はajax呼び出しの前に 'senderと' args'オブジェクトを変数に保存しようとしました。そうすれば成功関数で 'IsValid'と' innerHTML'属性を設定できますが、どちらも動作しません。 –

答えて

0

私はこれを動作させました。他の誰かがクライアントの検証を行い、サーバーへのデータベース呼び出しを行う必要がある場合。 1.サーバー呼び出しメソッドの結果を保存する関数に変数を追加しました。 2.変数を使用してargs.IsValid関数を設定しました。 3. innerHTMLを設定する必要はありませんでした。マークアップにエラーメッセージを設定します。 isValidがfalseの場合に表示されます。 最終マークアップ:

<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に設定されている場合はbooleanが返されます。有効でない場合はfalseに設定します。

関連する問題