2017-10-14 1 views
1

Je ne suis pas en mesure de charger le gridview au chargement de la page. Il continue à me donnerImpossible de charger le Gridview sur la charge

Uncaught TypeError: Impossible de lire la propriété 'length' de unsdefined. J'ai mnetioned le code et le gestionnaire ci-dessous. S'il vous plaît, aidez-moi à résoudre le problème. Le problème se produit dans le Jquery.

<script type="text/javascript"> 
      $(document).ready(function() { 
       BindGridView(); 

      }); 


function BindGridView() { 
      $.ajax({ 
       type: "POST", 
       url: "../Pm/uc/G.ashx/GetMailDetail", 
       contentType: "application/json;charset=utf-8", 
       data: {}, 
       dataType: "json", 
       success: function (data) { 
        if (data.d.length > 0) { 
         $("#grdDemo").append("<tr><th>Username</th></tr>"); 
         for (var i = 0; i < data.d.length; i++) { 

          $("#grdDemo").append("<tr><td>" + 
          data.d[i].Username + "</td> <td>"); 
         } 
        } 
       }, 
       error: function (result) { 
       } 
      }); 
     } 
     </script> 

    <asp:GridView ID="grdDemo" runat="server"> 
     </asp:GridView> 

C'est dans le gestionnaire. (Vous pouvez remplacer la requête avec quoi que ce soit.)

public void ProcessRequest(HttpContext context) 
    { 
     //int mailid = int.Parse(context.Request["mid"]); 
     //var detail = GetMailDetail(mailid); 
     var detail = GetMailDetail(); 

     if (detail != null) 
     { 
      context.Response.ContentType = "application/json"; 
      string json = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(detail); 
      context.Response.Write(json); 
     } 
     else 
     { 
      context.Response.StatusCode = 404; 
     } 
    } 

    //protected object GetMailDetail(int mailid) 
    protected object GetMailDetail() 
    { 
     List<DetailsClass> Detail = new List<DetailsClass>(); 

     Connection Con = new Connection(); 
     String Connection = Con.Active_Connection(); 
     SqlConnection con = new SqlConnection(Connection); 
     con.Open(); 
     DataTable dt = new DataTable(); 

     SqlCommand cmd = new SqlCommand("select Sp4_Txt from Sp4", con); 

     SqlDataAdapter da = new SqlDataAdapter(cmd); 
     DataTable dtGetData = new DataTable(); 

     da.Fill(dtGetData); 

     foreach (DataRow dtRow in dtGetData.Rows) 
     { 
      DetailsClass DataObj = new DetailsClass(); 
      DataObj.Username = dtRow["Sp4_Txt"].ToString(); 
      Detail.Add(DataObj); 
     } 

     return Detail.ToArray(); 
    } 
    public class DetailsClass //Class for binding data 
    { 
     public string Username { get; set; } 
    } 
    public bool IsReusable 
    { 
     get 
     { 
      return false; 
     } 
    } 
} 
+0

Salut pouvez-vous déclaré la fonction "fonction BindGridView()" avant que le $ (document) .prochain changement? –

+0

Pourquoi accédez-vous à 'data.d.length'? Où est le 'd'? À quoi vous attendez-vous? Avez-vous regardé dans la console réseau du navigateur pour vous assurer que vous recevez ce que vous attendez du serveur dans votre appel AJAX? – mason

+0

Pourquoi ne manipulez-vous pas correctement vos objets [IDisposable] (https://msdn.microsoft.com/en-us/library/system.idisposable (v = vs.110) .aspx) comme SqlConnection? Pourquoi commencez-vous à obtenir les données dans un DataTable plutôt que d'aller directement à votre classe fortement typée? – mason

Répondre

1

Cannot read property 'length' of undefined.

Cette erreur vient parce que vous accédez à la data.d sans vérifier data et l'accès data.d.length sans vérification data.d

Faites quelque chose comme:

if(data){ 
    if(data.d){ 
     if (data.d.length > 0) { 
       $("#grdDemo").append("<tr><th>Username</th></tr>"); 
       for (var i = 0; i < data.d.length; i++) { 

        $("#grdDemo").append("<tr><td>" + 
        data.d[i].Username + "</td> <td>"); 
       } 
      } 
     } 
}