2012-03-22 3 views
0

Je fais un appel AJAX en utilisant jQuery à une méthode de contrôle .ascx dans le code derrière pour obtenir une liste d'objets métier:jQuery Ajax pour ASP.NET .ascx contrôle

C# Code:

if (Request.Headers["X-OFFICIAL-REQUEST"] == "TRUE") ReturnList(Request.Params[1]); 

    protected void ReturnList(string param) 
    { 
    Response.Write(GetBusinesses(param)); 
    Response.Flush(); 
    try { 
     Response.Close(); 
     } 
    catch { } 
    Response.End(); 
    return; 
    } 

private string GetBusinesses(string classificationName) 
{ 
    System.Web.Script.Serialization.JavaScriptSerializer jSearializer = null; 
    if (!string.IsNullOrEmpty(classificationName)) 
    { 
     dSourse = BusinessesDBService.Instance.GetLatestListingsUpdates(classificationName).ToList(); 
     jSearializer = new System.Web.Script.Serialization.JavaScriptSerializer(); 
    } 
    return jSearializer.Serialize(dSourse); 

} 

jQuery code:

window.jQuery.ajax({ 
    type: "POST", 
    async: false, 
    url: location.href, 
    dataType: "json", 
    data: ({ 'FUNCTION': 'ReturnList', 'param0': classificationName.toLowerCase() }), 
    success: function (data) { 
     data = eval(data); 

    }, 
    error: function (XMLHttpRequest, textStatus, errorThrown) { 
    }, 
    beforeSend: function (xhr) { 
     xhr.setRequestHeader("X-OFFICIAL-REQUEST", "TRUE"); //Used to ID as a AJAX Request 
    }, 
    complete: function (XMLHttpRequest, textStatus) { 
    //build HTML 
     var tablestring = '<table ><tr><td>UsreID" + "</td><td>UserName</td></tr>'; 

     for (var i = 0, len = data.length; i < len; ++i) { 
      tablestring = tablestring + "<tr>"; 
      tablestring = tablestring + "<td>" + 
       data[i].BusinessID + "</td>"; 
      tablestring = tablestring + "<td>" + 
       data[i].BusinessName + "</td>"; 
      tablestring = tablestring + "</tr>"; 
     } 
     tablestring = tablestring + "</table>"; 
     var divResult = document.getElementById("divAjax"); 
     divResult.innerHTML = tablestring; 

    } 
}); 

l'appel http est exécuté fin et la collection est Seri alisé et retourné avec la réponse mais j'ai quelques problèmes ici. Le principal est que le HTML n'est pas créé - je ne suis pas capable de capturer la chaîne renvoyée. La chaîne ci-dessous apparaît dans la fenêtre de script Firebug une fois l'appel terminé

[{"BusinessID": 6549, "BusinessName": "Magasin d'ivoire", "IsMain": true}, {"BusinessID": 16565, "BusinessName": "Classic Nails", "IsMain"}, {"BusinessID": 5877, "BusinessName": "Visible Changes cheveux", "IsMain": true}]

Également dans le Firebug j'ai remarqué que chaîne dans l'objet de réponse XMLHttpRequest et le message d'erreur est "JSON n'est pas valide" Toutes les suggetions? Merci beaucoup.

+0

Si vous avez éprouvé des difficultés de JSON invalide et ne peut pas trouver le problème, je vous suggère d'utiliser un validateur comme [JSONLint] (http://jsonlint.com/). –

Répondre

-1

Pour une raison quelconque, le code de l'analyseur C# ci-dessous n'a pas ajouté "]" à la fin de la chaîne, donc j'ai dû l'ajouter manuellement - cela a fonctionné !!! Je vous remercie.

public static string Serialize<T>(T obj) 
    { 
     DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType()); 
     MemoryStream ms = new MemoryStream(); 
     serializer.WriteObject(ms, obj); 
     string retVal = Encoding.UTF8.GetString(ms.ToArray()); 
     return retVal + "]"; 
    } 
+1

Essayez 'Flushing' le MemoryStream. Si ce n'était pas en fait l'ajout du '] final qui serait un bogue significatif dans le cadre et plusieurs autres auraient des problèmes similaires. –

1

non valide JSON

[{"BusinessID":6549,"BusinessName":"Ivory Store","IsMain":true}, {"BusinessID":16565,"BusinessName":"Classic Nails","IsMain"},{"BusinessID":5877,"BusinessName":"Visible Changes Hair","IsMain":true}] 

Voir la partie manquante au milieu "IsMain" a probablement besoin soit

[{"BusinessID":6549,"BusinessName":"Ivory Store","IsMain":true}, {"BusinessID":16565,"BusinessName":"Classic Nails","IsMain":true},{"BusinessID":5877,"BusinessName":"Visible Changes Hair","IsMain":true}] 

OU

[{"BusinessID":6549,"BusinessName":"Ivory Store","IsMain":true}, {"BusinessID":16565,"BusinessName":"Classic Nails","IsMain":false},{"BusinessID":5877,"BusinessName":"Visible Changes Hair","IsMain":true}] 

Voir cette page: cliquez sur le Bouton JSLint: http://jsfiddle.net/QmMdC/

+0

Mon mauvais, la "partie manquante" sur IsMain est ok, j'ai perdu le "vrai" morceau en tronquant le JSON réel - environ 30 champs. Je posterai le JSON de l'objet entier demain. Je vous remercie. – itisinteresting

+0

Pour une raison quelconque, le code d'encodeur C# ci-dessous n'a pas ajouté "]" à la fin de la chaîne, donc j'ai dû l'ajouter manuellement - ça a marché !!! Je vous remercie. chaîne statique publique Sérialiser (T obj) { DataContractJsonSerializer sérialiser = new DataContractJsonSerializer (obj.GetType()); MemoryStream ms = new MemoryStream(); serializer.WriteObject (ms, obj); chaîne retVal = Encoding.UTF8.GetString (ms.ToArray()); return retVal + "]"; } – itisinteresting

+0

Oui, j'ai vu votre code C# et ce n'est certainement pas la façon dont je le fais, donner une classe et laisser le cadre gérer la sérialisation de cette classe semble être la façon de faire sur ce .. –

Questions connexes