是否有方便的方法从字符串返回视图而不必来自磁盘上的文件?
我已经实现了一个自定义VirtualPathProvider
来处理从数据库中检索视图,但我并不总是希望将视图存储在数据库中。
更新2-15-2011
我偶然发现very nice open source component简化了在代码中编译Razor视图的过程。我已经用这个组件替换了很多虚拟路径提供程序代码,并且它的工作非常好。我推荐给那些试图从数据库或其他地方编译视图而不需要虚拟路径提供程序的附加功能的人。该组件允许您直接在控制器/ app /中编译视图(不需要Web上下文和控制器上下文),而无需跳过VPP箍。
答案 0 :(得分:1)
您可以通过创建RazorTemplateEngine
来自行运行视图,该WebViewPage
会读取您的来源并编译为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);
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);
}
}
要support the new @model
keyword,您需要覆盖RazorEngineHost中的方法以使用MVC的自定义生成器:
{{1}}