Nous avons vu dans mon précédent post comment apporter des modifications au ViewEngine utilisé par défaut par MVC. Aujourd’hui, ça va se compliquer puisque nous allons voir ce qu’il est nécessaire de savoir pour créer un ViewEngine complet.
Contrairement à ce que nous avons vu précédemment, où nous ne faisions qu’apporter des modification au WebFormViewEngine, cette fois nous aurons un contrôle total du code HTML qui sera généré, libre à vous d’utiliser des pages PHP ou de créer votre propre langage serveur ! Par contre, je ne vous cache pas que mettre ça en place vous demandera un peu plus de boulot que d’utiliser les webforms.
Pour créer un nouveau View Engine from scratch, il va nous falloir implémenter 2 interfaces: IView, qui représentera nos vues (ce qui nous permettre de renvoyer le code html au client), et IViewEngine, qui nous servira à charger la vue correcte en fonction du contexte et du nom de la vue.
Commençons par la vue : l’interface IView nous demande de faire une méthode Render, qui reçoit des informations dans le viewContext, et devra écrire le code HTML à renvoyer au client dans un TextWriter.
{
#region IView Members
public void Render(ViewContext viewContext, System.IO.TextWriter writer)
{
// on va faire notre rendu ici
}
#endregion
}
Nous avons ici toute liberté pour faire ce que nous voulons ! Nous allons par exemple aller chercher notre vue en base de données : pour cela, nous avons une table toute simple avec 2 colonnes : le nom de la vue, et le code HTML correspondant.
Nous pouvons créer notre DatabaseView qui ira chercher en base de données le code html, au lieu de chercher un fichier.
{
private String viewName;
public DatabaseView(String viewName)
{
this.viewName = viewName;
}
#region IView Members
public void Render(ViewContext viewContext, System.IO.TextWriter writer)
{
using (DatabaseViewsDataContext context = new DatabaseViewsDataContext())
{
ViewContent content = context.ViewContents.SingleOrDefault(v => v.ViewName == viewName);
if (content != null)
writer.Write(content.Text);
}
}
#endregion
}
Il ne nous reste plus qu’à créer le View Engine qui va bien, pour pouvoir appeler correctement nos vues. Nous avons 3 méthodes à implémenter : pour récupérer une vue, pour récupérer une vue partielle, et pour libérer la mémoire de notre vue.
{
#region IViewEngine Members
public ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache)
{
return new ViewEngineResult(new DatabaseView(partialViewName), this);
}
public ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
{
return new ViewEngineResult(new DatabaseView(viewName), this);
}
public void ReleaseView(ControllerContext controllerContext, IView view)
{
IDisposable disposableView = view as IDisposable;
if (disposableView != null)
disposableView.Dispose();
}
#endregion
}
J’ai ici fait au plus simple, mais vous avez tout loisir pour faire plus compliqué si vous le désirez, pour gérer les vues mobiles, ou bien différentes langues. N’oubliez pas non plus de gérer le cache lorsqu’on vous le demande (et oui, refaire un ViewEngine, ça veut dire qu’il faut TOUT refaire).
Voilà, vous avez toutes les clés en main pour créer votre propre View Engine, maintenant à vous de jouer !
Cross-posté vers Tech Head Brothers