如何在Web API Controller上返回Json对象

我在我的asp.net控制器上使用下面的代码在javascript上返回我的Ajax上的Json对象

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({ 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控制器上完成?

你能给我一些例子或url作为参考。

感谢致敬

如果你自己创建一个新的HttpContent类来提供JSON,比如……

  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一样。

ASP.NET Web API使用一些不同的哲学。 您应该只返回一个实体(或一组实体),并由内容协商机制将其以请求的格式返回给客户端。 您可以在此处详细了解内容协商:

  • 您想要了解的有关ASP.NET Web API内容协商的所有内容

您当然可以通过返回HttpResponseMessage绕过内容失效。 在这种情况下,你需要自己将对象序列化为JSON(这种方法的基础也在上面提到的文章中描述)。

在阅读了tpeczek的回答,Darrel Miller的回答,以及他们在tpeczek的回答中的评论对话之后,我希望得到更多关于我何时或为什么要使用Web Api及其内容协商机制的指导。 tpeczek的链接提供了丰富的信息和实用性,但我发现其他一些文章更适合将Web Api(及其内容协商)的使用与返回JsonResult普通MVC 4控制器操作进行JsonResult 。 以下是我发现做出这样决定有用的内容。 其中一位作者得出结论,他更喜欢使用普通的MVC 4控制器,而另一位作者更喜欢使用Web Api控制器:

为数据构建公共HTTP API

我相信上述作者的post需要进行一次修正。 他在那里提到,

“…以’Get’开头的每个[Controller]方法都会自动与GET动词相关联。听起来不错吗?是的,但这也意味着你不能有两个名字以’Get’开头的方法在同一个控制器类中。“

根据这个答案 ,如果指定了ActionName属性,那么在同一个控制器中确实可以有多个“Get”方法。 现在这是第二篇文章:

ASP.NET Web API与ASP.NET MVC“API”