22

Ho usato questo codice qui sotto sul mio controller asp.net per tornare oggetto JSON sul mio Ajax su javascriptCome restituire oggetto JSON sul controller Web API

public JsonResult myMethod() 
{ 
    // return a Json Object, you could define a new class 
    return Json(new 
    { 
     Success = true, //error 
     Message = "Success" //return exception 
    }); 
} 

Jquery-Ajax:

$.ajax({ 
    type: "POST", 
    url: url_ , 
    data: search, 
    success: function(data) { 
     //Show Json Properties from Controller (If Success == false show exception Message from controller) 
     if (data.Success) 
     { 
      alert(data.Message); //display success 
     } 
     else 
     { 
      alert(data.Message) //display exception 
     } 
    }, 
    error: function(XMLHttpRequest, textStatus, errorThrown) { 
     alert("error: " + XMLHttpRequest.responseText); 
    }, 
    dataType: 'json' 
}); 

Come si può fare su Web Api Controller?

Potete darmi alcuni esempi o url come riferimento.

Grazie e saluti

risposta

25

Se si crea da soli una nuova classe HttpContent per la consegna di JSON, come ...

public class JsonContent : HttpContent { 

    private readonly MemoryStream _Stream = new MemoryStream(); 
    public JsonContent(object value) { 

     Headers.ContentType = new MediaTypeHeaderValue("application/json"); 
     var jw = new JsonTextWriter(new StreamWriter(_Stream)); 
     jw.Formatting = Formatting.Indented; 
     var serializer = new JsonSerializer(); 
     serializer.Serialize(jw, value); 
     jw.Flush(); 
     _Stream.Position = 0; 

    } 
    protected override Task SerializeToStreamAsync(Stream stream, TransportContext context) { 
     return _Stream.CopyToAsync(stream); 
    } 

    protected override bool TryComputeLength(out long length) { 
     length = _Stream.Length; 
     return true; 
    } 
} 

allora si può fare,

 public HttpResponseMessage Get() { 
      return new HttpResponseMessage() { 
       Content = new JsonContent(new 
       { 
        Success = true, //error 
        Message = "Success" //return exception 
       }) 
      }; 
     } 

proprio come si fa con JsonResult.

+6

Perché non utilizzare il comportamento di serializzazione predefinito dell'API Web e semplicemente restituire il tipo direttamente e lasciare che il framework gestisca la serializzazione? –

+2

@TedNyberg Perché a volte è molto importante controllare il formato del filo. Lasciare che un serializzatore prenda le decisioni per te può renderti dipendente da quel serializzatore e dalla sua configurazione. Questo è meno un problema per Json che XML, ma può ancora essere un problema. –

+0

Funziona alla grande. Grazie! –

30

ASP.NET Web API lavora con una filosofia diversa po '. Dovresti restituire solo un'entità (o un insieme di entità) e spetta al meccanismo di negoziazione del contenuto restituirlo al cliente nel formato che ha richiesto. Si può leggere di più su negoziazione dei contenuti qui:

Ovviamente si può by-pass del contenuto negiotiation restituendo un HttpResponseMessage. In questo caso è necessario serializzare l'oggetto in JSON da solo (i principi di questo approccio sono descritti anche nell'articolo menzionato sopra).

+0

A mio parere, che non è né la filosofia del Web API o di negoziazione dei contenuti. Restituire tipi arbitrari è uno stile particolare di utilizzo dell'API Web che è possibile, ma che presenta molte potenziali insidie. La negoziazione del contenuto è il meccanismo in cui un client dichiara quali tipi di media è in grado di elaborare e il server tenta di soddisfare le preferenze del client. L'enfasi è molto diversa dal dire che il client richiede il formato X. Puoi anche fare ancora conneg e restituire HttpResponseMessage. –

+0

@DarrelMiller In generale sono d'accordo, e non vorrei scrivere questa risposta ora come ho fatto 4 mesi fa - bene che il tuo sia accettato. Credo che alcune persone abbiano trovato il mio utile soprattutto a causa del contenuto disponibile sotto il link. – tpeczek

+0

Speriamo che più persone si renderanno conto una volta che iniziano a utilizzare WebAPI che l'interesse iniziale di restituire solo gli oggetti non è così utile come sembra. –

10

Dopo aver letto la risposta di tpeczek, la risposta di Darrel Miller e la loro conversazione di commento nella risposta di tpeczek, volevo ottenere maggiori indicazioni su quando o perché potrei voler utilizzare Web Api e il suo meccanismo di negoziazione del contenuto. Il collegamento di tpeczek è informativo e utile, ma ho trovato un paio di altri write-up che erano più orientati a confrontare l'uso di Web Api (e la sua negoziazione del contenuto) con azioni di controller MVC 4 semplici che restituiscono JsonResult. Ecco quelli che ho trovato utile per prendere una decisione del genere. Uno dei autore conclude che preferisce utilizzando semplici MVC 4 controller mentre l'altro autore preferisce utilizzare i controller Web Api:

Building a Public HTTP API for Data

Credo che ci sia una correzione necessaria in post dell'autore sopra. Lì egli afferma che,

" ... ogni metodo [Controller] che inizia con 'Get' è automaticamente associato al verbo GET. Suona grande? E ', ma anche significa che non è possibile avere due metodi il cui nome inizia con "Ottieni" nella della stessa classe di controller. "

Secondo this answer, è possibile infatti avere più metodi 'get' nella stesso controller se si specifica un attributo ActionName.Ora ecco il secondo post:

ASP.NET Web API vs. ASP.NET MVC “APIs”

Problemi correlati