1) Controller

Le controlleur est une des brique super importante. Parfois, il faut ajouter des comportements ou des données sous forme de propriétés comme par exemple des collections de "droits",.... En effet, il faut parfois instancier un autre controller en fonction d'un contexte Y. Ceci se fait très rapidement en ASP.NET MVC. Il suffit d'implémenter une classe héritant par exemple de la classe "standard" utilisée dans le framework. On Ajoutera le comportement dans cette classe. La génération des classes "Controller" passera toujours par cette classe !

public class CustomControllerFactory : DefaultControllerFactory
{
    // Création d'une classe IController
    public override IController CreateController(RequestContext requestContext, string controllerName)
    {
        return base.CreateController(requestContext, controllerName);
    }
 
    // Fin des traitements
    public override void ReleaseController(IController controller)
    {
        base.ReleaseController(controller);
    }
}

Cependant, tout ne fonctionne pas directement. En effet, il faut enregistrer la factory de controller comme étant celle à utiliser dans l'applicatif.

ControllerBuilder.Current.SetControllerFactory(typeof(CustomControllerFactory));

2) View Engine

Il est également possible de "modifier" la factory gérant le rendu dans l'application. Cela offre de nouvelles perspectives comme le support de plusieurs vues différentes en fonction du "browser". Il est donc possible en quelques lignes d'avoir une vue pour IPhone et une autre vue pour IE tout en gardant le même controller etc etc. Pour se faire il faut surcharger la méthode recherchant les bonnes vues !

public class CustomViewEngine : WebFormViewEngine
{
    protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath)
    {
        return base.CreatePartialView(controllerContext, partialPath);
    }
 
    protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath)
    {
        // Méthode appelée en second
        return base.CreateView(controllerContext, viewPath, masterPath);
    }
 
    public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
    {
        // Méthode appelée en premier
        return base.FindView(controllerContext, viewName, masterName, useCache);
    }
 
    public override ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache)
    {
        return base.FindPartialView(controllerContext, partialViewName, useCache);
    }
}

Il faut également toujours comme précisé plus haut modifier le moteur de rendu dans le fichier global.asax pour prendre en compte le nouveau moteur.

ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new CustomViewEngine());

3) Conclusion

Après lecture de ce post, il vous sera très facile d'ajouter de nouvelles opportunités à votre application ASP.NET MVC ! Si vous voulez par exemple ajouter le support des "mobiles", je vous conseille également le fichier "browser" des mobiles disponible ici.