2012-03-30 3 views
1

Ich habe diese Funktion mir eine Liste von Managern zurückASP.NET AJAX Rückkehr JSON, aber nicht als JSON anerkannt

function getManagers() { 
    var jqxhr = $.ajax({ 
        type: 'POST', 
        contentType: "application/json; charset=utf-8", 
        url: '/webservice.asmx/GetManagers', 
        dataType: 'json' 
       }).success(function(data) { 
        var options = '<option selected="selected" disabled="disabled">Select Manager</option>'; 
        for (var i = 0; i < data.length; i++) { 
         options += '<option value="' + data[i].PostRef + '">' + data[i].Description + '</option>'; 
        } 
        $('#ReceivingCellManager').html(options); 
       }).error(function(data) { 
        $('.ErrorText').html('Manager load failed please refresh page with F5'); 
        $("#errormessage").dialog('open'); 
       }).complete(function() { 
      }); 
} 

wie man sehen kann ich JQuery bin mit und will eine Dropdown-Liste popoulate mit die zur Verfügung stehenden Manager

das Verfahren in meinem Dienst wie dieser

[WebMethod] 
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
    public void GetManagers() 
    { 
     using (var context = new ConcessionModel()) 
     {    
      var rcm = Business.GetManager(); 
      var serializer = new JavaScriptSerializer(); 
      var response = rcm.Count() != 0 
       ? serializer.Serialize(rcm) 
       : serializer.Serialize(new Error { Code = "500", Message = "Manager Retrieval Failed" }); 
      this.Context.Response.Clear(); 
      this.Context.Response.ContentType = "application/json"; 
      this.Context.Response.Write(response); 
     } 
    } 

sieht Wenn die Methode, die ich eine Antwort von 200 OK empfangen genannt wird und die Antwort enthält das JSON. Ich möchte, dass das Problem darin besteht, dass die Antwort nicht als JSON erkannt wird.

ich versucht habe

  • datatype zum Ajax-Aufruf hinzugefügt, wie Sie oben
  • Entfernen this.Context.Response.flush vom Ende der Antwort sehen können, diese geheilt Ein Fehler, den ich beim Anpassen der Header nach dem Senden bekommen habe.
  • ein Antwortformat auf das Verfahren das Hinzufügen
  • Hinzufügen eines Response.ContentType zum Context Diese haben alle versagt mir die geforderte Anerkennung des JSON zu bekommen. Jede Hilfe würde sehr geschätzt werden.

UPDATE: JSON-Format

{ "Beschreibung": "Daten", "Code": "Daten", "Referenz": "Daten"}

UPDATE JSON RESPONSE ich sehe komisch etwas in der Antwort meine Antwort als

[{"Description":"data","Code":"data","reference":"data"}]{"d":null} 

ich bin nicht sicher, folgt, ist, was die d null Objekt ist

+0

warum Sie WCF nicht verwenden (mit REST) ​​und eine JSON-Antwort? ... alles selbst zu konvertieren ist wirklich schrecklich! –

+2

Sind in Ihren erfolgreichen Daten JSON enthalten, und könnten Sie einen Beispieldump posten? :) –

+1

@MarcoJohannesen danke für die Antwort, Nein der Erfolg feuert nicht, der Fehler tut. Ich habe gerade einen kleinen Test gemacht und der Fehler enthält auch die Daten nicht. – Deviland

Antwort

5

In Um auf das JSON-Objekt zuzugreifen, z. B. ein Objekt der Klasse 'Hund' aus dem Dienst, sollte der Methodenrückgabetyp 'Hund' sein. Verwenden Sie response.write nicht in Diensten. Sie können dann mit 'data.d' auf die Daten aus der Erfolgsmeldung zugreifen.

Hoffe, das hilft!

+0

YEAAAAH !!! Danke :) –

1

versuchen, es zu analysieren, wie ich unten gezeigt haben, ist es für mich funktioniert:

var result = JSON.parse(data, function (key, value) { 
        var type; 
        if (value && typeof value === 'object') { 
         type = value.type; 
         if (typeof type === 'string' && typeof window[type] === 'function') { 
          return new (window[type])(value); 
         } 
        } 
        return value; 
       }); 

Und die Daten führen ändern:

for (var i = 0; i < result.length; i++) { 
         options += '<option value="' + result[i].PostRef + '">' + result[i].Description + '</option>'; 
        } 
+0

@dhavaishukla Ich glaube nicht, dass ich die Daten in JSON analysieren muss, da dies der erwartete zurückgegebene Datentyp sein sollte Wenn ich hier falsch liege, lass es mich bitte wissen – Deviland

1

In der Erfolgsfunktion Das Rückgabeobjekt ist 'Daten'.

Um auf die JSON-Daten zugreifen zu können, müssen Sie über 'data.d' darauf zugreifen.

Ich kann nicht helfen, aber beachten Sie, dass Ihr Web-Service void zurückgibt, vielleicht könnte das auch sein, warum es keine Antwort gibt ??

+0

Ich greife auf das Datenobjekt als Daten innerhalb der Schleife zu, die Dienste geben void zurück, weil sie eine Antwort schreiben, die kein Standardobjekt zurückgibt. – Deviland

+0

Anstatt eine Antwort zu schreiben, geben Sie das gesamte Objekt zurück. Dann erkennt die Ajax-Methode es als json! –

2

das Problem gelöst, indem die content von dem Ajax-Request Entfernen und Hinzufügen von Einstellungen auf die Web-Konfigurations wie in diesem Beitrag beschrieben Request format is unrecognized for URL unexpectedly ending in

Vielen Dank für Ihre Hilfe 1 ups rundum :)

+0

Nach 3 Tagen Kopf kratzen und kämpfen, ist Ihre Lösung, was für mich arbeitete. Danke vielmals. –

1

für mich Dies funktionierte:

[WebMethod] 
[ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
public void HelloWorld() { 

    JavaScriptSerializer serializer = new JavaScriptSerializer(); 

    string strResponse = serializer.Serialize("World"); ; 

    Context.Response.Clear(); 
    Context.Response.ContentType = "application/json"; 
    Context.Response.AddHeader("content-length", strResponse.Length.ToString()); 
    Context.Response.Flush(); 

    Context.Response.Write(strResponse); 


} 
+0

Gute Arbeit! Vielen Dank! – toha