2013-08-15 4 views
36

Ich kann nicht erhalten, wie ich JSON-Daten mit meinem Code zurückgeben kann.Zurückgeben von JSON mit ASP.NET & jQuery

JS

$(function() { 
$.ajax({ 
     type: "POST", 
     url: "Default.aspx/GetProducts", 
     data: "{}", 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     success: function (msg) { 
      // How to return data here like a table??? 
      $("#Second").text(msg.d); 
      //alert(msg.d); 
     } 
    }); 
}); 

C# von Default.aspx.cs

[WebMethod] 
public static string GetProducts() 
{ 
    var products = context.GetProducts().ToList(); 
    return What do I have to return ???? 
} 

Vielen Dank im Voraus!

+1

Warum benutzen Sie nicht web api? –

+2

Probieren Sie die JavaScriptSerializer-Klasse aus. –

+0

Werfen Sie einen Blick auf diese Frage: http://stackoverflow.com/questions/8405458/return-json-data-from-asmx-web-service Grundsätzlich müssen Sie eine JSON-Zeichenfolge zurückgeben und dafür müssen Sie verwenden JavaScriptSerializer zum Serialisieren von C# -Objekten/-Listen in JSON-Zeichenfolgen Du bist nicht weit. – frenchie

Antwort

37

Sie‘ nicht weit; Sie müssen so etwas wie dies tun:

[WebMethod] 
public static string GetProducts() 
{ 
    // instantiate a serializer 
    JavaScriptSerializer TheSerializer = new JavaScriptSerializer(); 

    //optional: you can create your own custom converter 
    TheSerializer.RegisterConverters(new JavaScriptConverter[] {new MyCustomJson()}); 

    var products = context.GetProducts().ToList(); 

    var TheJson = TheSerializer.Serialize(products); 

    return TheJson; 
} 

Sie diesen Code reduzieren kann weiter aber ich habe es so, dass aus Gründen der Klarheit. Tatsächlich könnten Sie sogar Folgendes schreiben:

return context.GetProducts().ToList(); 

und dies würde eine JSON-Zeichenfolge zurückgeben. Ich bevorzuge es, expliziter zu sein, weil ich benutzerdefinierte Konverter verwende. Es gibt auch Json.net, aber das Framework JavaScriptSerializer funktioniert einfach out of the box.

+5

Sie können dies auch über Ihre statische Methode mit 'hinzufügen JavaScriptSerializer' '[ScriptMethod (UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]' –

+1

Was soll 'MyCustomJson' hier sein? Können Sie einen Link zu einem Beispiel bereitstellen? Ich frage mich, wie viel manuelle Codierung für eine bestimmte Klasse notwendig ist. –

+1

Wenn Sie keinen benutzerdefinierten Konverter haben, serialisiert/deserialisiert Ihr Serialisierungsprogramm Ihr C# -Objekt mit dem gleichen Eigenschaftennamen zu json. Wenn Sie jedoch möchten, dass sich Ihr Javascript-Objekt von Ihrem C# -Objekt unterscheidet oder Sie einige Validierungsregeln bei der Deserialisierung einbeziehen möchten, benötigen Sie einen benutzerdefinierten Konverter. Hier sind einige Fragen, die ich zu diesem Thema gestellt habe: http://stackoverflow.com/questions/4998595/serializing-only-parts-of-an-object-with-json http://stackoverflow.com/questions/10193024/nested- json-custom-converter-in-c-sharp-with-javascriptconverter – frenchie

2

Asp.net ist ziemlich gut in der automatischen Konvertierung von. Net-Objekten in JSON. Wenn Ihr List-Objekt in Ihrer Webmethode zurückgegeben wird, sollte ein json/javascript-Array zurückgegeben werden. Was ich damit meine, ist, dass Sie den Rückgabetyp nicht in einen String ändern sollten (weil Sie denken, dass der Client dies erwartet), wenn Sie Daten von einer Methode zurückgeben. Wenn Sie ein .net-Array von einer Webmethode zurückgeben, wird ein Java-Array an den Client zurückgegeben. Es funktioniert nicht wirklich gut für kompliziertere Objekte, aber für einfache Array-Daten ist es in Ordnung.

Natürlich liegt es an Ihnen, zu tun, was Sie auf der Client-Seite tun müssen.

Ich würde so etwas wie dieses denken:

[WebMethod] 
public static List GetProducts() 
{ 
    var products = context.GetProducts().ToList(); 
    return products; 
} 

Es sollte wirklich keine Notwendigkeit, alle benutzerdefinierten Konvertern zu initialisieren, wenn Ihre Daten komplizierter als einfache Zeile/Spalte Daten

-6

Versuchen Sie, diese zu verwenden, es funktioniert für mich perfekt

// 

    varb = new List<object>(); 

// Example 

    varb.Add(new[] { float.Parse(GridView1.Rows[1].Cells[2].Text)}); 

// JSON + Serializ 

public string Json() 
     { 
      return (new JavaScriptSerializer()).Serialize(varb); 
     } 


// Jquery SIDE 

    var datasets = { 
      "Products": { 
       label: "Products", 
       data: <%= getJson() %> 
      } 
5

Diese Struktur funktioniert für mich - Ich habe es in einem kleinen Aufgaben-Management-Anwendung.

Der Controller:

public JsonResult taskCount(string fDate) 
{ 
    // do some stuff based on the date 

    // totalTasks is a count of the things I need to do today 
    // tasksDone is a count of the tasks I actually did 
    // pcDone is the percentage of tasks done 

    return Json(new { 
    totalTasks = totalTasks, 
    tasksDone = tasksDone, 
    percentDone = pcDone 
    }); 
} 

Im AJAX-Aufruf greife ich auf die Daten wie folgt aus:

.done(function (data) { 
    // data.totalTasks 
    // data.tasksDone 
    // data.percentDone 
}); 
11

Nur Objekt zurückgeben: es Parser JSON sein wird.

public Object Get(string id) 
{ 
    return new { id = 1234 }; 
} 
+0

Sehr kurz und bündig ! Großartige Idee. –

Verwandte Themen