2011-02-03 77 views
2

有没有一种方便的方式来从字符串返回视图,而不必从磁盘上的文件来?ASP.NET MVC3 Razor - 从字符串创建视图?

我已经实现了一个自定义VirtualPathProvider来处理从数据库中检索视图,但我并不总是希望视图被存储在数据库中。

更新2011年2月15日

我碰到一个very nice open source component,它简化了在code.I've编译剃刀意见换下大部分的虚拟路径提供的代码与此组件的过程中偶然发现,它的工作令人难以置信的好。我向任何试图从数据库或其他地方编译视图的人推荐它,这些人不需要虚拟路径提供者的附加功能。该组件允许您直接在您的控制器/应用程序/任何内容(不需要Web上下文和控制器上下文)中编译视图,而无需跳过VPP环。

回答

1

您可以通过创建RazorTemplateEngine来自己运行视图,该视图可以读取源代码并编译为WebViewPage

然后,您可以通过编写

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); 

support the new @model keyword运行WebViewPage,你需要重写你的RazorEngineHost使用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); 
    } 
}