ASP.NET MVC 3: New ActionResult Types

Una de las nuevas caracteristicas que trae esta versión de ASP.NET MVC son tres nuevos tipos de ActionResults:

  • HttpNotFoundResult: se utiliza para indicar que un recurso no se encontró, el famoso código 404.
  • HttpRedirectResult: se utiliza para indicar si una re-dirección permanente debe ocurrir.
  • HttpStatusCodeResult: se puede utilizar para establecer un código derespuesta de estado y la descripción explícita.

Básicamente lo que hacen es viajar desde el controlador a la vista con un código de estado especifico (Response.StatusCode) que luego sera procesado por el servidor. Ahora veamos un ejemplo de cada uno:

HttpNotFoundResult

Veamos un ejemplo simple, vamos a crear un método de acción llamado Details que recibe como parámetro un Id de producto, trata de recuperarlo y en caso de no hacerlo devuelve un error Http 404:

1: public ActionResult Details(int  id)
2: {
3:     var product = BussinesLogic.GetProductById(id);
4:
5:     if (product == null)
6:     {
7:         return HttpNotFound();
8:     }
9:
10:     return View();
11: }

El método HttpNotFound() lo que hace es devolver un HttpNotFoundResult. El resultado es el siguiente en el caso de que el producto no exista:

Http 404

Http 404

Viendo esta pantalla me pregunte, porque no re-direcciona a la pantalla de error personalizada que había configurado?… la respuesta la tengo gracias a José María Aguilar que me comento que HttpNotFound() lo único que hace es modificar sobre el canal de salida (Response) el código de estado y la descripción. Por lo tanto desde el punto de vista del framework no es ningún error que se deba procesar atendiendo al <customErrors>. Esta situación no fue algo que me agrado demasiado, pero puede ser una buena alternativa cuando utilizamos servicios del tipo REST (es decir, cuando las peticiones sobre las acciones las realiza una aplicación cliente).

HttpRedirectResult

Este resultado de acción se utiliza si queremos devolver una redirección temporal (con el código de estado Http 302) o una redirección permanente (código de estado Http 301). El tipo de redirección se define en función de un parámetro booleano llamado permanent o invocando distintos métodos como veremos a continuación.

Con la nueva versión del framework, la clase Controller ahora tiene tres métodos que devuelven una instancia de RedirectResultRedirectPermanent, RedirectToRoutePermanent RedirectToActionPermanent.

Veamos un ejemplo de una redirección permanente utilizando el método RedirectPermanent:

1: public ActionResult Details(int id)
2: {
3:     var  product = BussinesLogic.GetProductById(id);
4:
5:     if  (product == null)
6:     {
7:         return RedirectPermanent("/Product/Index");
8:     }
9:
10:     return View();
11: }

Básicamente lo que estamos haciendo es que en el caso de no encontrar un producto redireccionar al Index de los mismos. Si inspeccionamos el acceso a la acción Details con un Id inexistente el resultado sera un error 301 y la redicción a la pantalla principal de productos:

Http 301

Http 301

HttpStatusCodeResult

Este último ActionResult nos permite definir a nosotros el código de estado que queremos retornar como respuesta. En nuestro caso vamos a retornar el código Http 204 (el cual indica que el servidor ha recibido y aceptado la solicitud, pero entiende que no es preciso servir ningún documento como respuesta). En nuestro ejemplo, en el caso de que no exista el producto no es necesario mostrar información alguna, por lo tanto queremos permanecer en la pantalla actual.

1: public ActionResult Details(int  id)
2: {
3:     var product = BussinesLogic.GetProductById(id);
4:
5:     if  (product == null)
6:     {
7:         return new HttpStatusCodeResult(204, "No existe contenido.");
8:     }
9:
10:     return View();
11: }

Ejecutamos y veremos nuestro código de estado al intentar acceder al detalle de un producto inexistente:

Http 204

Http 204

El servidor no nos lleva a la pantalla de detalle del producto debido al código que le retornamos, por lo tanto quedaremos en la pantalla desde la cual quisimos acceder.

Espero que le sea de utilidad!

Anuncios

3 comentarios en “ASP.NET MVC 3: New ActionResult Types

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s