2016-03-22 6 views
0

Yinelenmeleri önlemek için eklerken bir gridview sütununu doğrulamak istiyorum. Izgara, bu alana ait tüm değerleri kontrol etmek için veritabanına gitmem gereken sayfalar içeriyor. Döndükten sonra, değer mevcutsa, Hata mesajını 'UserID var' olarak ayarlamak istiyorum.Gridview Özel Validator, ajax çağrısından döndükten sonra innerHTML ayarlayamıyor

Sorunum, WebMethod sonuçlarıyla birlikte döndüğünde, sender veya args parametrelerine erişimim yok. success işlevinde bir uyarı ayarladığımda değer boş.

Veritabanına geri dönmeniz gerektiğinde, çoğaltmaları doğrulamanın en iyi yolu bu mu? Eğer öyleyse, sender ve args parametrelerini nasıl kaydedebilirim, böylece özel doğrulama tetiklenir. Kullanıcı kimliği varlığını doğrulamak için jquery işlevinden adlandırılır

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

C# yöntemi:

<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> 

Bu özel doğrulama sırasında çağrılır jquery fonksiyonudur:

Bu

benim biçimlendirme:

[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 işlevi çağrılır ve doğru olup olmadığını belirler. veritabanında erID var veya yok.

Benim sorunum, success işlevinde sender nesnesinin boş olmasıdır. Veritabanına gitmeden önce bunu nasıl kaydedebilirim? Veya varlığı kontrol etmek için daha iyi bir yaklaşım var mı?

+0

şuna bir bakın: http://stackoverflow.com/questions/3636228/asp-net-custom-validator-how-to-get-the-controltovalidate-property-on-clientv – Zaki

+0

bu benim sorunum değil . Göndericiyi .ajax çağrısını yapmadan önce tanımlayabilirim. Sunucudan geri döndüğünde, 'gönderen' ve 'args' sıfırdır. Ajax çağrısından önce gönderici ve 'args' nesnelerini bir değişkende kaydetmeyi denedim, bu yüzden başarı fonksiyonunda 'IsValid' ve' innerHTML 'özelliklerini ayarlayabilirim fakat bu da işe yaramıyor. –

cevap

0

Bunu işe aldım. Başka birinin istemci doğrulaması yapması ve sunucuya bir veritabanı çağrısı yapması gerekiyorsa .. 1. sunucu çağrı yönteminin sonuçlarını kaydetmek için fonksiyona bir değişken eklendi. args.IsValid işlevini ayarlamak için değişkeni kullanın. 3. innerHTML'yi ayarlamanıza gerek yoktur. Hata mesajını işaretlemede ayarlayın. isValid yanlışsa görüntülenir. Final Biçimlendirme:

<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> 

Final jquery işlevi:

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

Sunucu Yöntem çağrısı aynı kaldı. Geçerliyse true olarak ayarlanmışsa boolean döndürülür; geçerli değilse false olarak ayarlanır.