public WebFormViewEngine() {
MasterLocationFormats = new[] {
"~/Views/{1}/{0}.master",
"~/Views/Shared/{0}.master"
};
ViewLocationFormats = new[] {
"~/Views/{1}/{0}.aspx",
"~/Views/{1}/{0}.ascx",
"~/Views/Shared/{0}.aspx",
"~/Views/Shared/{0}.ascx"
PartialViewLocationFormats = ViewLocationFormats;
}
public class MyCustomViewEngine : WebFormViewEngine
{
public MyCustomViewEngine()
"~/MesMasterPages/{1}/{0}.master",
"~/MesMasterPages/{0}.master"
"~/MesVues/{1}/{0}.aspx",
"~/MesVues/{0}.aspx"
PartialViewLocationFormats = new[] {
"~/MesVues/{1}/{0}.ascx",
"~/MesVues/{0}.ascx"
public class MobileViewSelector : WebFormViewEngine
public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName,
string masterName, bool useCache)
// on récupère le domaine utilisé pour venir sur le site
String domain = controllerContext.RequestContext.HttpContext.Request.Url.Authority.ToLower();
// si on est sur un domaine pour mobile, on va chercher la vue dans un sous-dossiers "mobile"
if (domain.StartsWith("m") || domain.StartsWith("iphone"))
viewName = "Mobile/" + viewName;
// on appelle la requête de base
return base.FindView(controllerContext, viewName, masterName, useCache);
protected void Application_Start()
RegisterRoutes(RouteTable.Routes);
// On supprime le ViewEngine par défaut, on n'en a plus besoin
ViewEngines.Engines.Clear();
// On enregistre notre ViewEngine
ViewEngines.Engines.Add(new MobileViewSelector());
public class MyCompletelySpecificView : IView
#region IView Members
public void Render(ViewContext viewContext, System.IO.TextWriter writer)
// on va faire notre rendu ici
#endregion
public class DatabaseView : IView
private String viewName;
public DatabaseView(String viewName)
this.viewName = viewName;
using (DatabaseViewsDataContext context = new DatabaseViewsDataContext())
ViewContent content = context.ViewContents.SingleOrDefault(v => v.ViewName == viewName);
if (content != null)
writer.Write(content.Text);
public class DatabaseViewEngine : IViewEngine
#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,
return new ViewEngineResult(new DatabaseView(viewName), this);
public void ReleaseView(ControllerContext controllerContext, IView view)
IDisposable disposableView = view as IDisposable;
if (disposableView != null)
disposableView.Dispose();