View ASP.NET MVC3 Razor-从字符串创建视图?
有没有一种方便的方法可以从字符串返回视图,而不必从磁盘上的文件返回 我已经实现了一个定制的View ASP.NET MVC3 Razor-从字符串创建视图?,view,asp.net-mvc-3,razor,View,Asp.net Mvc 3,Razor,有没有一种方便的方法可以从字符串返回视图,而不必从磁盘上的文件返回 我已经实现了一个定制的VirtualPathProvider,它处理从数据库检索视图的问题,但我并不总是希望视图存储在数据库中 更新日期:2011年2月15日 我偶然发现了一个可以简化代码中Razor视图编译过程的组件。我用这个组件替换了大部分虚拟路径提供程序代码,它工作得非常好。我向那些试图从数据库或其他地方编译视图而不需要虚拟路径提供程序附加功能的人推荐它。此组件允许您直接在控制器/应用程序/任何内容(不需要web上下文和控
VirtualPathProvider
,它处理从数据库检索视图的问题,但我并不总是希望视图存储在数据库中
更新日期:2011年2月15日
我偶然发现了一个可以简化代码中Razor视图编译过程的组件。我用这个组件替换了大部分虚拟路径提供程序代码,它工作得非常好。我向那些试图从数据库或其他地方编译视图而不需要虚拟路径提供程序附加功能的人推荐它。此组件允许您直接在控制器/应用程序/任何内容(不需要web上下文和控制器上下文)中编译视图,而无需跳过VPP环。您可以通过创建一个
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);
要使用MVC的自定义生成器,您需要覆盖RazorEngineHost中的方法:
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);
}
}