Suite de la série de billets sur les nouveautés d'ASP.NET MVC 3 écrits conjointement avec Philippe Viallate, MVP et responsable de la rubrique .NET sur Developpez.com. Vous pouvez consulter les précédents billets :
- [ASP.NET MVC] Nouveautés MVC 3 Part 1 - Améliorations dans Visual Studio 2010
- [ASP.NET MVC] Nouveautés MVC 3 Part 2 - Améliorations pour la Validation
[MyActionFilter]Les développeurs souhaitent souvent appliquer une logique de filtre sur tous les contrôleurs au sein d'une application. ASP.NET MVC 3 permet maintenant de spécifier un filtre qui doit s'appliquer globalement à tous les contrôleurs d'une application. Vous pouvez maintenant le faire en les ajoutant à la collection GlobalFilters. Une méthode RegisterGlobalFilters est maintenant incluse par défaut dans le fichier Global.asax afin de fournir un endroit pratique pour réaliser cela :
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
public ActionResult About()
{
return View();
}
}
public static void RegisterGlobalFilters(GlobalFilterCollection filters)Cette nouveauté est très pratique si vous voulez qu'elle s'applique à tous les contrôleurs et les actions de votre application. Mais que faire si vous voulez qu'elle ne s'applique que sous certaines conditions, comme par exemple lorsque le débogage est activé. Supposons que vous ayez besoin d'afficher une information lorsqu'il est activé, mais lorsque vous déployez en production vous ne voulez pas que vos utilisateurs la voient. On utilisera pour cela un fournisseur de filtre personnalisé. Votre classe doit mettre en oeuvre l'interface IFilterProvider. Le code ci-dessous illustre cet exemple :
{
filters.Add(new MyActionFilterAttribute());
}
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
public class DebugFilterProvider : IFilterProviderLa méthode GetFilters boucle sur toutes les conditions, qui est en fait une liste générique qui contient un délégué, et si ce délégué n'est pas null, alors il va créer un nouvel objet filtre et de le renvoyer. Ainsi dans votre fichier Global.asax, vous pouvez ajouter ce code afin que ce filtre fonctionne uniquement lorsque le débogage est activé :
{
private readonly List<Func<ControllerContext, object>> _conditions = new List<Func<ControllerContext, object>>();
public void Add(Func<ControllerContext, object> condition)
{
_conditions.Add(condition);
}
public IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor)
{
return from condition in _conditions
select condition(controllerContext) into filter
where filter != null
select new Filter(filter, FilterScope.Global);
}
}
public static void RegisterGlobalFilters(GlobalFilterCollection filters)Les Global Action Filters ainsi que l'utilisation de conditions offrent de nombreuses possibilités. On peut par exemple imaginer la déclaration d'un ActionFilter dans le Global.asx pour toutes les actions nommées "Index" dans notre application. Cette nouveauté MVC 3 en réjouira plus d'un !
{
filters.Add(new HandleErrorAttribute());
var provider = new DebugFilterProvider();
provider.Add(c => c.HttpContext.IsDebuggingEnabled ? new MyActionFilterAttribute() : null);
FilterProviders.Providers.Add(provider);
}