ASP.NET MVC – Definindo JsonRequestBehavior.AllowGet de forma global

Standard

Pessoal, uma dica bem rápida mas que ajuda muito nosso desenvolvimento do dia-a-dia com MVC, vou mostrar aqui duas maneiras de definir de forma global o Enum JsonRequestBehavior para habilitar requisições GET em nossos controllers. Atualmente quando trabalhamos com ASP.NET MVC (A partir da versão 2) todo retorno de Json deve habilitar requisições GET, veja abaixo:

public UsuarioController : Controller
{
   public ActionResult SelecionaTexto()
   {
       return Json("Retorno", JsonRequestBehavior.AllowGet);
   }
}

Agora veja duas forma bem simples para melhorarmos isso.

Forma 1 – Sobrepor JsonResult

Primeiramente vamos criar um outro controller, e em seguida sobrepor o método Json:

public SuperController : Controller
{
   protected override JsonResult Json(object data, string contentType, Encoding contentEncoding, JsonRequestBehavior behavior)
   {
       return base.Json(data, contentType, contentEncoding, JsonRequestBehavior.AllowGet);
   }
}

Agora basta alterarmos o controller que é utilizado em UsuarioController, desta forma já é possível fazer algo como:

public UsuarioController : SuperController
{
   public ActionResult SelecionaTexto()
   {
       return Json("Retorno");
   }
}

Forma 2 – Implementar ActionFilter

Uma outra forma de fazermos isso é utilizando ActionFilters, veja:

public class JsonAllowGetAttribute : ActionFilterAttribute
{
    private JsonRequestBehavior behavior { get; set; }

    public JsonAllowGetAttribute()
    {
        behavior = JsonRequestBehavior.AllowGet;
    }

    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        var result = filterContext.Result as JsonResult;

        if (result != null)
            result.JsonRequestBehavior = behavior;
    }
}

Agora basta referencia-lo em nosso Controller:

[JsonRequestBehavior]
public UsuarioController : Controller
{
   public ActionResult SelecionaTexto()
   {
       return Json("Retorno");
   }
}

Simples não? Cool

Leave a Reply

Your email address will not be published. Required fields are marked *