Customizando regras com IRouteConstraint no ASP.NET MVC 3

No artigo anterior, foi mostrado como criar regras customizadas para rotas utilizando expressões regulares. Mas essas customização, se for utilizada para outras rotas, precisaria ser replicada a expressão regular, aumentando os locais para manutenções futuras.Hoje mostrarei como você pode criar suas próprias classes de regras (Constraint) de rotas. O Framework ASP.NET MVC disponibiliza a interface *IRouteConstraint *a qual possui o método Match. Quando precisamos criar classes customizadas para criar validações de regras, é esta interface que precisamos implementar. O método Match possui os seguintes parâmetros:

TipoParâmetro*Descrição*
HttpContextBasehttpContextContém informações específicas sobre cada requisição HTTP
Routerouteparâmetro com informações sobre a rota definida no Global.asax
RouteValueDictionaryvaluesContem o(s) valor(es) para o(s) parâmetro(s) definido para a rota
RouteDirectionrouteDirectionEspecifica a direção da origem da URL. Se veio do Browser ou foi gerada pelo ASP.NET
Com as explicações dos parâmetros sobre o método Match, Crie uma classe com o nome DateParameterConstraint e abaixo segue a customização de regras de rota necessária ao nosso POST:

public bool Match( HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) { bool result = false; if (values.ContainsKey(parameterName)) { String parameterValue = values[parameterName] as String; if (!String.IsNullOrWhiteSpace(parameterValue)) { result = Regex.Match(parameterValue, @"d{2}-d{2}-d{4}").Success; } } return result; }  

Agora vamos criar uma rota no arquivo Global.asax onde passará a usar a classe que acabamos de criar acima, ou seja, além de estarmos customizando nossa rota, estamos customizando, também, uma classe que terá a regra de validação para nossa Constraint. Segue o código da rota:

routes.MapRoute( "Compra", // Route name "Compras/{dataCompra}", // URL with parameters new { controller = "Compras", action = "Compras" }, // Parameter defaults new { dataCompra = new DateParameterConstraint() } );  

Pronto! Já temos nossa classe de RouteConstraint implementada, nossa regra já foi criada, agora é hora de testar a aplicação.

Código Fonte

Até a próxima!

Comments