2011-02-03 6 views
2

Existe-t-il un moyen pratique de renvoyer une vue à partir d'une chaîne au lieu de devoir provenir d'un fichier sur le disque?ASP.NET MVC3 Razor - créer une vue à partir d'une chaîne?

J'ai implémenté un VirtualPathProvider personnalisé qui gère la récupération des vues d'une base de données, mais je ne souhaite pas toujours que la vue soit stockée dans la base de données.

Mise à jour 2-15-2011

je suis tombé sur un very nice open source component qui simplifie le processus de compilation des vues Razor dans code.I've a remplacé une grande partie du code fournisseur de chemin virtuel avec ce composant, et il travaille incroyablement bien. Je le recommande à tous ceux qui essaient de compiler des vues à partir d'une base de données ou ailleurs qui n'ont pas besoin des capacités supplémentaires d'un fournisseur de chemin virtuel. Ce composant vous permet de compiler la vue directement dans votre contrôleur/application/tout (contexte Web et contexte de contrôleur non requis) sans avoir à sauter par les cerceaux VPP.

Répondre

1

Vous pouvez exécuter la vue vous-même en créant un RazorTemplateEngine qui lit votre source et la compile en WebViewPage.

Vous pouvez ensuite exécuter le WebViewPage en écrivant

webViewPage.OverridenLayoutPath = LayoutPath; 
webViewPage.VirtualPath = ViewPath; 
webViewPage.ViewContext = viewContext; 
webViewPage.ViewData = viewContext.ViewData; 

webViewPage.InitHelpers(); 
WebPageRenderingBase startPage = null; 
if (RunViewStartPages) { 
    startPage = StartPageLookup(webViewPage, RazorViewEngine.ViewStartFileName, ViewStartFileExtensions); 
} 
webViewPage.ExecutePageHierarchy(new WebPageContext(context: viewContext.HttpContext, page: null, model: null), writer, startPage); 

Pour support the new @model keyword, vous aurez besoin de remplacer les méthodes dans votre RazorEngineHost d'utiliser les générateurs personnalisés de MVC:

public override RazorCodeGenerator DecorateCodeGenerator(RazorCodeGenerator incomingCodeGenerator) { 
    if (incomingCodeGenerator is CSharpRazorCodeGenerator) { 
     return new MvcCSharpRazorCodeGenerator(incomingCodeGenerator.ClassName, 
               incomingCodeGenerator.RootNamespaceName, 
               incomingCodeGenerator.SourceFileName, 
               incomingCodeGenerator.Host); 
    } 
    else if (incomingCodeGenerator is VBRazorCodeGenerator) { 
     return new MvcVBRazorCodeGenerator(incomingCodeGenerator.ClassName, 
              incomingCodeGenerator.RootNamespaceName, 
              incomingCodeGenerator.SourceFileName, 
              incomingCodeGenerator.Host); 
    } 
    return base.DecorateCodeGenerator(incomingCodeGenerator); 
} 

public override ParserBase DecorateCodeParser(ParserBase incomingCodeParser) { 
    if (incomingCodeParser is CSharpCodeParser) { 
     return new MvcCSharpRazorCodeParser(); 
    } 
    else if (incomingCodeParser is VBCodeParser) { 
     return new MvcVBRazorCodeParser(); 
    } 
    else { 
     return base.DecorateCodeParser(incomingCodeParser); 
    } 
} 
Questions connexes