I used this below code on my asp.net controller to return Json object on my Ajax on javascript
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'
});
How can this be done on Web Api Controller?
Can you give me some examples or url as reference.
Thanks and Regards
To return JSON from the server, you must include the JSON data in the body of the HTTP response message and provide a "Content-Type: application/json" response header. The Content-Type response header allows the client to interpret the data in the response body correctly.
To return data in a specific format from a controller that inherits from the Controller base class, use the built-in helper method Json to return JSON and Content for plain text. Your action method should return either the specific result type (for instance, JsonResult ) or IActionResult .
ASP.NET Web API works with a little bit different philosophy. You should return just an entity (or set of entities) and it is up to content negotiation mechanism to return it to the client in the format which he has requested. You can read more about content negotiation here:
You can of course bypass the content negiotiation by returning a HttpResponseMessage
. In this case yo need to serialize the object into JSON yourself (basics of this approach are also described in the article mentioned above).
If you create yourself a new HttpContent class for delivering JSON, like...
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;
}
}
Then you can do,
public HttpResponseMessage Get() {
return new HttpResponseMessage() {
Content = new JsonContent(new
{
Success = true, //error
Message = "Success" //return exception
})
};
}
just like you do with JsonResult.
After reading tpeczek's answer, Darrel Miller's answer, and their comment conversation in tpeczek's answer, I wanted get more guidance about when or why I might want to use Web Api and its content negotiation mechanism. tpeczek's link is informative and useful, but I found a couple other write-ups that were more geared at comparing the use of Web Api (and its content negotiation) with, say, plain MVC 4 controller actions that return JsonResult
. Here are the ones that I found useful to making such a decision. One of the author concludes that he prefers using plain MVC 4 controllers while the other author prefers using Web Api controllers:
Building a Public HTTP API for Data
I believe there is one correction needed in the above author's post. In there he mentions that,
"...every [Controller] method that begins with 'Get' is automatically associated to the GET verb. Does it sound great? It is, but it also means that you can’t have two methods whose name begin with 'Get' in the same controller class."
According to this answer, you can indeed have multiple 'Get' methods in the same controller if you specify an ActionName
attribute. Now here's the second post:
ASP.NET Web API vs. ASP.NET MVC “APIs”
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With