Uma das coisas mais interessantes que já vi foi o tal do Model Binder e o objetivo desse artigo é demonstrar como criar uma classe com essa característica para usar tanto no MVC como no Web API.
Model Binder ou Model Binding é um mecanismo para popular (Binding) um objeto (Model) a partir de dados disponíveis em uma solicitação Request do navegador.
Overview do Model Binder:
O Model Binding já acontece na sua aplicação!
Quando você usa MVC, por exemplo, e faz um POST de um formulário, o MVC pega todos esses dados do formulário e popula um objeto prontinho e fresquinho automaticamente, disponibilizando a você toda vez que ele encontra esse objeto em um parâmetro, nos métodos ActionResult, veja um exemplo mais prático:
Imagine a URL “/clientes/salvar” no MVC para receber POST de um formulário. O método ActionResult no MVC seria assim:
[HttpPost]
public async Task<ActionResult> Salvar(ClienteViewModel viewModel)
{
return Content("teste");
}
No código acima, o MVC irá popular o parâmetro viewModel do método Salvar com todos os dados que vieram no POST.
Objetivos desse artigo:
Para esse artigo, o que precisaremos?
1 – Um projeto web para as plataformas MVC + Web API que você poderá criá-lo a partir do Visual Studio 2015 mesmo.
Ou se preferir você pode usar o Visual Studio 2017, mas dê uma olhada no UNBOXING VS2017 que escrevi com minhas primeiras impressões da nova IDE e decida se realmente precisa usar o 2017.
2 – Uma classe que implementará as interfaces de Binding para ambas as plataformas acima.
3 – Configurar a classe Model Binder nessas mesmas plataformas.
Qual é o objetivo da solução?
– Retornar informações sobre o ambiente do usuário logado, URL que foi solicitada, credenciais, informações de browser e outras coisas.
Classe Model Binder:
public class EnvironmentInfoModelBinder : System.Web.Mvc.IModelBinder, System.Web.Http.ModelBinding.IModelBinder
{
///<summary>
/// MVC version
/// </summary>
/// <param name="controllerContext"></param>
/// <param name="bindingContext"></param>
/// <returns></returns>
public object BindModel(System.Web.Mvc.ControllerContext controllerContext,
System.Web.Mvc.ModelBindingContext bindingContext)
{
var info = new Models.EnvironmentInfo();
info.RequestedUrl = controllerContext.RequestContext.HttpContext.Request.Url.ToString();
info.UserId = GetLoggedUser();
// you also can get form/request properties
return info;
}
///<summary>
/// WEB API version
/// </summary>
/// <param name="actionContext"></param>
/// <param name="bindingContext"></param>
/// <returns></returns>
public bool BindModel(System.Web.Http.Controllers.HttpActionContext actionContext,
System.Web.Http.ModelBinding.ModelBindingContext bindingContext)
{
var info = new Models.EnvironmentInfo();
info.RequestedUrl = actionContext.Request.RequestUri.ToString();
info.UserId = GetLoggedUser();
// you also can get form/request properties
bindingContext.Model = info;
return true;
}
private string GetLoggedUser()
{
//just a sample
return "3242423423";
}
}
Tanto o MVC como Web API entendem uma classe Model Binder quando há implementação da interface IModelBinder. Os métodos BindModel demonstrados acima disponibilizam todo o Contexto, Controller e Request para você brincar e acessar praticamente qualquer coisa no ambiente Server.
Para que o MVC ou Web API populem o objeto “EnvironmentInfo” com informações do ambiente do usuário logado, é ncessário registrar a classe acima na aplicação web.
Configuração da classe para MVC (Global.asax):
protected void Application_Start()
{
ModelBinders.Binders.Add(typeof(Models.EnvironmentInfo), new Binders.EnvironmentInfoModelBinder());
}
Configuração da classe para Web API (WebApiConfig.cs):
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
config.BindParameter(typeof(Models.EnvironmentInfo), new Binders.EnvironmentInfoModelBinder());
}
}
Uso no Controller do MVC:
public ActionResult Index(Models.EnvironmentInfo environmentInfo)
{
return View();
}
Uso no Controller do Web API:
public IHttpActionResult Get(Models.EnvironmentInfo environmentInfo)
{
var result = new
{
EnvironmentInfo = environmentInfo
};
return Ok(result);
}
E a mágica?
Ainda falando sobre a mágica, o .NET tentará popular o objeto com informações do Request que ele tentará encontrar na ordem em:
1 – Request.Form – Formulários.
2 – RouteData.Values – Dados nas Rotas.
3 – Request.Querystring – Dados na querystring na URL.
4 – Request.Files – Dados de arquivos.
Tanto é que, se você tiver uma URL com o formato “/{controller/{action}/{id}” por exemplo “/clientes/salvar/39349” e usar o nome “id” no parâmetro de um método ActionResult, será retornado o valor 39349.
public ActionResult Index(string id)
{
return Contet("vai retornar 39349");
}
Quem fará isso é o mecanismo Default de Binding do .NET.
Bom por hoje é isso. Espero que tenha ajudado.
A Mágica de Model Binder no MVC e Web API
Model Binder no MVC e Web API: Perguntas, sugestões ou críticas são bem vindas. Boa sorte!
| Faça download completo do código fonte no github. |

