22

我用我的asp.net控制器上這下面的代碼上的JavaScript在我的Ajax返回JSON對象如何在網頁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的阿賈克斯返回JSON對象:

$.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' 
}); 

這怎麼能在Web Api控制器上完成?

你可以給我一些例子或網址作爲參考。

感謝和問候

回答

25

如果你自己創建的交付JSON,像一個新的HttpContent類...

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; 
    } 
} 

然後你就可以做,

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

就像你JsonResult做。

+6

爲什麼不使用Web API的默認序列化行爲,直接直接返回類型並讓框架處理序列化? –

+2

@TedNyberg因爲有時候控制線路格式非常重要。讓序列化程序爲您做出決定可以使您依賴於該序列化程序及其配置。這對於Json來說不​​是XML問題,但它仍然是一個問題。 –

+0

工程很好。謝謝! –

30

ASP.NET Web API的工作原理有點不同。您應該只返回一個實體(或一組實體),並由內容協商機制返回給客戶,格式爲他所請求的格式。你可以閱讀更多有關內容協商這裏:

當然你也可以繞道通過返回HttpResponseMessage內容negiotiation。在這種情況下,你需要將對象序列化成JSON(這種方法的基礎也在上面提到的文章中描述過)。

+0

在我看來,這既不是網頁API或內容協商的理念。返回任意類型是使用web API的一種特殊風格,但有一個潛在的缺陷。內容協商是客戶聲明它能夠處理哪些媒體類型並且服務器試圖適應客戶的偏好的機制。重點與說客戶端請求格式X非常不同。您還可以執行連接並返回HttpResponseMessage。 –

+0

@DarrelMiller總的來說,我同意了,現在我不會像4個月前那樣寫這個答案 - 很好,你的是被接受的。我相信有些人發現我的幫助主要是因爲鏈接下的內容。 – tpeczek

+0

希望有更多的人一旦開始使用WebAPI就會意識到,僅僅返回對象的初始吸引力並不像看起來那麼有用。 –

10

在閱讀tpeczek的回答,Darrel Miller的回答以及他在tpeczek回答中的評論對話之後,我想獲得關於何時或爲什麼我想要使用Web Api及其內容協商機制的更多指導。 tpeczek的鏈接是信息豐富且有用的,但我發現了其他一些比較Web API(及其內容協商)的使用與簡單的MVC 4控制器操作(比如返回JsonResult)相比較的更多方法。以下是我發現對做出這樣的決定有用的那些。一個作者的結論是,他更喜歡用簡單的MVC 4個控制器,而其他作者傾向於使用網絡API控制器:

Building a Public HTTP API for Data

我相信這是在上面筆者的職位需要一個修正。在那裏,他提到,

」 ......每一個[控制器]方法與‘GET’開始是自動關聯到GET動詞 。聽起來是不是很大?是的,但它也 意味着您不能有兩個方法的名稱以 中的'Get'開頭,並且是相同的控制器類。「

根據this answer,你的確可以在同一個控制器的多條「GET」方法,如果你指定一個ActionName屬性。現在,這裏的第二個職位:

ASP.NET Web API vs. ASP.NET MVC 「APIs」