ASP.NET MVC Controllers

Entendendo Controllers

Controllers são responsáveis por respostas a requisições feitas em um website ASP.NET MVC.Cada requisição de um navegador é mapeada para um controller em particular.Por exemplo,imagine que você entre com a seguinte URL no seu navegador:

http://localhost:4656/Product/Index/3

Nesse caso,um controller chamado ProductController é chamado.Esse controller é responsável por gerar a resposta para a requisição do navegador.Por exemplo,o controller poderia retornar uma View em particular para o navegador ou poderia redirecionar o usuario para outro controller.

Veja abaixo o ProductController:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Ajax; 

namespace MvcApplication1.Controllers
{
public class ProductController : Controller
{
//
// GET: /Products/

public ActionResult Index()
{
// Add action logic here
return View();
}

}
}

Como você pode ver acima,um controller é somente uma classe.Um controller é uma classe que deriva da classe base System.Web.Mvc.Controller.Como todo controller herda dessa classe base,um controller herda muitos métodos úteis gratuitamente.

Entendendo Actions

Uma Action é um método em um controller que é chamado quando você entra com uma URL particular no navegador.Por exemplo,a seguinte URL:

http://localhost:4656/Product/Index/3

Nesse caso,o método Index é chamado na classe ProductController.O método Index é exemplo de uma action.

Uma action deve ser um método público de um controller.Métodos C#,por padrão são privates.Perceba que qualquer método público em um controller é considerado uma action automaticamente (por isso você deve ser cuidadoso,pois esse método pode ser invocado por qualquer um no universo simplesmente digitando a URL correspondente no navegador).

Existem alguns outros requerimentos para uma action.Um método usado como action não pode ser sobreescrito.Também não pode ser static.Fora isso,você pode usar qualquer outro método como action.

Entendendo Action Results

Uma action retorna algo chamado action result.Uma action result é o que um controller retorna em resposta a uma requisição de um navegador.

O ASP.NET MVC framework contém vários tipos de action results:

  1. ViewResult – Representa HTML e markup
  2. EmptyResult – Representa resultado vazio
  3. RedirectResult – Representa redirecionamento para uma nova URL
  4. JsonResult – Representa um resultado JSON que pode ser utilizado numa aplicação AJAX
  5. JavaScriptResult – Representa um script JavaScript
  6. ContentResult – Representa um resultado em texto
  7. FileContentResult – Representa um arquivo que pode ser baixado (com conteúdo binário)
  8. FilePathResult – Representa um arquivo que pode ser baixado (com um path)
  9. FileStreamResult – Representa um arquivo que pode ser baixado (com um stream)

Todos esses Action Results herdam da classe base ActionResult.

Na maioria dos casos,uma action retorna um ViewResult.Por exemplo,o método Index abaixo retorna um ViewResult:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Ajax; 

namespace MvcApplication1.Controllers
{
public class BookController : Controller
{

public ActionResult Index()
{
// Add action logic here
return View();
}

}
}

Quando uma action retorna um ViewResult um HTML é gerado para o navegador.O método Index acima retorna uma view chamada Index para o navegador.

Note que a action Index não retorna um ViewResult().Ao invés disso,o método View() da classe controller é chamado.Normalmente,você não retorna um action result diretamente.Ao invés disso,você chama um dos seguinte métodos,da classe controller:

  1. View – Retorna um action result ViewResult
  2. Redirect – Retorna um action result RedirectResult
  3. RedirectToAction – Retorna um action result RedirectToRouteResult
  4. RedirectToRoute – Retorna um action result RedirectToRouteResult
  5. Json – Retorna um action result JsonResult
  6. JavaScriptResult – Retorna um JavaScriptResult
  7. Content – Retorna um action result ContentResult
  8. File – Retorna um FileContentResult,FilePathResult,ou FileStreamResult dependendo dos parâmetros passados para o método

Então,se você quer retornar uma View para o navegador,você chama o método View().Se você quer redirecionar o usuario de uma action para outra,você chama o método RedirectToAction().Por exemplo,a action Details abaixo,ou mostra uma View ou redireciona o usuario para a action Index dependendo se o parâmetro ID tiver algum valor:

using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
public class CustomerController : Controller
{
public ActionResult Details(int? id)
{
if (!id.HasValue)
return RedirectToAction(“Index”);

return View();
}

public ActionResult Index()
{
return View();
}

}
}

A ContentResult action é especial.Você pode usa-lo pra retornar um action result em formato de texto plano.Por exemplo,o método Index abaixo retorna o resultado como texto plano e não como HTML:

using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
public class StatusController : Controller
{

public ActionResult Index()
{
return Content(“Hello World!”);
}

}
}

Quando o método Index é chamado uma View não é retornada.Ao invés disso,em seu lugar o texto plano “Hello World!” é retornado para o browser.

Se uma action retornar um valor que não seja um action result – por exemplo,uma Data ou um inteiro – então o resultado é colocado num ContentResult automaticamente.Por exemplo,quando o método Index abaixo é chamado, a data é colocada como ContentResult automaticamente:

using System;
using System.Web.Mvc; 

namespace MvcApplication1.Controllers
{
public class WorkController : Controller
{

public DateTime Index()
{
return DateTime.Now;
}

}
}

O ASP.NET MVC converte o objeto DateTime pra uma string e coloca o resultado num ContentResult automaticamente.O navegador recebe a data como texto plano.

É isso aí pessoal até apróxima!
Qualquer dúvida deixem comentários que responderei assim que possível.

ASP.NET MVC Entendendo Action Filters

Entendendo Action Filters

Um Action Filter é um atributo que você pode aplicar a uma Action de um controller,ou a um controller diretamente – o que modifica a maneira como essa action é executada.O framework MVC ja inclui muitos Action Filters

  • OutputCache – Esse action filter coloca o resultado de uma action em cache por um tempo determinado
  • Handle Error – Esse action filter manipula erros disparados durante a execução da action de um controller
  • Authorize – Esse action filter permite a você restringir acesso a um usuario ou role em particular

Você pode também criar seu próprio action filter.Por exemplo,você pode querer criar seu próprio action filter para implementar um sistema de autenticação personalizado.Ou,você pode querer criar um action filter que modifique a viewdata retornado por uma action de um controller.

Usando um action filter

Um action filter é um atributo.Você pode aplicar a maioria dos action filters para uma action ou diretamente para um controller inteiro.Por exemplo,o DataController abaixo contém uma action chamada Index que retorna a data atual.Essa action está decorada com o action filter OutputCache .Esse action filter faz com que o valor retornado pela action seja colocado em cache por 10 segundos.

using System;
using System.Web.Mvc; 

namespace MvcApplication1.Controllers
{
public class DataController : Controller
{
[OutputCache(Duration=10)]
public string Index()
{
return DateTime.Now.ToString(“T”);

}
}
}

Se você chamar repetidamente a action Index digitando a URL /Data/Index na barra de endereços do seu navegador e pressionando o botão de refresh varias vezes,você verá o mesmo horário durante 10 segundos.A saída da action Index é colocada em cache durante 10 segundos (figura 1):

No exemplo acima,um unico action filter – o OutputCache – é aplicado ao método Index.Se você precisar,você pode aplicar vários action filters diferentes a mesma action.Por exemplo,você pode querer aplicar os action filters OutputCache e HandleError para a mesma action.

No exemplo acima,o action filter está sendo aplicado diretamente na action Index,mas você também poderia ter aplicado diretamente ao controller.Nesse caso,todas as actions deste controller teriam suas saídas colocadas em cache durante 10 segundos.

Os diferentes tipos de filters

O ASP.NET MVC suporta quatro diferentes tipos de filters:

  1. Authorization filters – Implementa o atributo IAuthorizationFilter
  2. Action filters – Implementa o atributo IActionFilter
  3. Result filters – Implementa o atributo IResultFilter
  4. Exception filters – Implementa o atributo IExceptionFilter

Os filters são executados na ordem listada acima.Por exemplo,authorization filters são sempre executados antes de action filters e exception filters são sempre executados após qualquer outro tipo de filter.

Authorization Filters são usados para implementar autenticação e autorização para actions de um controller.Por exemplo,o Authorize filter é um exemplo do Authorization Filter.

Action Filters contém lógica que é executada antes e depois que a action de um controller é executada.Você pode usar um action filter,por exemplo,para modificar a ViewData que uma action retorna.

Result Filters contém lógica que é executada antes e depois da execução de um View Result.Por exemplo,você pode querer modificar um ViewResult um pouco antes da view ser renderizada para o navegador.

Exception Filters são os últimos tipo de filter que são executados.Você pode usar exception filters para tratar erros disparados pela suas actions ou pelo resultado das suas actions.Você também pode usa-lo para criar um log de erros.

Cada tipo diferente de filter é executado numa ordem em particular.Se você quiser modificar a ordem de execução de cada filter do mesmo tipo você pode setar a propriedade ORDER do filter.

A classe base para todos os filters é System.Web.Mvc.FilterAttribute.Se você quiser implementar um tipo particular de filter,então você precisa criar uma classe que herde dessa classe base e implemente uma ou mais das seguintes intefaces:IAuthorizationFilter,IActionFilter,IResultFilter ou IExceptionFilter.

<h3>A classe base ActionFilterAttribute</h3>

Pra facilitar a sua vida quando você quiser implementar um filter próprio,o ASP.NET MVC inclui uma classe base <em>ActionFilterAttribute</em>.Essa classe implementa as interfaces <em>IResultFilter</em> e <em>IActionFilter</em> herda da classe filter.

A terminologia aqui não é perfeitamente consistente.Tecnicamente,uma classe que herda da classe <em>ActionFilterAttribute</em> é tanto um Action Filter quanto um Result Filter.O termo Action Filter é usado para se referir a qualquer tipo de filter no ASP.NET MVC.

A classe <em>ActionFilterAttribute</em> possui os seguintes métodos que você pode sobrescrever:

  • OnActionExecuting – Esse método é chamado antes de uma action ser executada
  • OnActionExecuted – Esse método é chamado depois de uma action ser executada
  • OnResultExecuting – Esse método é chamado antes de uma action result ser executada
  • OnResultExecuting – Esse método é chamado depois de uma action result ser executada

Vamos ver como implementar esses métodos.

Criando um Action Filter de Log

Pra ilustrar como criar nosso próprio action filter,nós iremos criar um filter que registre os estágios de processo de uma action para a janela Output do Visual Studio.Segue abaixo:

using System;
using System.Diagnostics;
using System.Web.Mvc;
using System.Web.Routing; 

namespace MvcApplication1.ActionFilters
{
public class LogActionFilter : ActionFilterAttribute

{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
Log(“OnActionExecuting”, filterContext.RouteData);
}

public override void OnActionExecuted(ActionExecutedContext filterContext)
{
Log(“OnActionExecuted”, filterContext.RouteData);
}

public override void OnResultExecuting(ResultExecutingContext filterContext)
{
Log(“OnResultExecuting”, filterContext.RouteData);
}

public override void OnResultExecuted(ResultExecutedContext filterContext)
{
Log(“OnResultExecuted”, filterContext.RouteData);
}

private void Log(string methodName, RouteData routeData)
{
var controllerName = routeData.Values[“controller”];
var actionName = routeData.Values[“action”];
var message = String.Format(“{0} controller:{1} action:{2}”, methodName, controllerName, actionName);
Debug.WriteLine(message, “Action Filter Log”);
}

}
}

Os métodos OnActionExecuting, OnActionExecuted,OnResultExecuting e OnResultExecuted chamam o método Log.O nome do método e a RouteData são passados para o método Log.O método Log escreve uma mensagem na janela output do Visual Studio conforme abaixo:

O HomeController abaixo ilustra como podemos aplicar o Log Action Filter para um controle inteiro.Quando qualquer das actions deste controle for chamada,(Index ou About) os estagios do processo de execução serão mostrados na janela Output do Visual Studio.

using System.Web.Mvc;
using MvcApplication1.ActionFilters; 

namespace MvcApplication1.Controllers
{
[LogActionFilter]
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}

public ActionResult About()
{

return View();
}
}
}

É isso aí!Até a próxima pessoal!