![Hands-On Full:Stack Web Development with ASP.NET Core](https://wfqqreader-1252317822.image.myqcloud.com/cover/264/36699264/b_36699264.jpg)
IActionResult and ActionResult<T>
The IActionResult interface defines the contract <indexentry content="HTTP response:ActionResult"> for action method responses. The default implementation of the interface is provided by the ActionResult and ActionResult<T> types, but ASP.NET Core provides many derived response types that you can use to fully control the HTTP response that will be generated. Here is a short list of some of them:
- EmptyResult: Generates an HTTP response with a success status code (200 OK) and an empty body.
- ObjectResult: Generates a response with a body, where the body is a serialization of an object you provide. The object is serialized to the content type that was requested by the client.
- BadRequestResult: Generates a response with a BadRequst status code (400) that signals to the client that the given request is invalid.
- ViewResult: Allows you to render a view, from a cshtml file, for example, and return the result (as HTML) to the client.
- FileResult: Generates a response that contains file data. There are derived classes for various file reading formats.
- RedirectResult: Generates a response with a temporary redirect (302) or permanent redirect status code (301) that contains the URL to navigate to.
Starting from ASP.NET Core 2.1, the ActionResult<T> type can be used as the return type of a controller action to make it explicit what the type of the body will be in a successful response, while still allowing for the return of other response types if needed.
For example, if GiveNTake receives a request to add a product with invalid request data, we send the client a BadRequestResult, and if the request was valid, we echo the request data with an ObjectResult, like this:
[HttpPost("")]
public ActionResult<NewProductDTO> AddNewProduct([FromBody] NewProductDTO newProduct)
{
if (!ModelState.IsValid)
{
return new BadRequestResult();//(ModelState);
}
return newProduct;
}