如何渲染字符串Razor页面为字符串?实现自定义模板数据库存储
动态Razor字符串渲染方案(替代停更的RazorEngine)
完全可以实现需求,以下是几种基于ASP.NET生态的可靠方案:
方案1:基于ASP.NET Core原生Razor编译API实现
ASP.NET Core本身提供了底层的Razor编译能力,无需依赖第三方库即可直接编译并渲染字符串形式的Razor模板,支持自定义标签。
实现步骤:
- 引用
Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilationNuGet包 - 编写渲染服务类,利用
RazorProjectEngine处理虚拟字符串模板 - 注册服务并注入使用
代码示例:
using Microsoft.AspNetCore.Mvc.Razor; using Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation; using Microsoft.AspNetCore.Mvc.ViewFeatures; using Microsoft.Extensions.DependencyInjection; using System.IO; public class DynamicRazorRenderer { private readonly IRazorViewEngine _razorViewEngine; private readonly ITempDataProvider _tempDataProvider; private readonly IServiceProvider _serviceProvider; public DynamicRazorRenderer(IRazorViewEngine razorViewEngine, ITempDataProvider tempDataProvider, IServiceProvider serviceProvider) { _razorViewEngine = razorViewEngine; _tempDataProvider = tempDataProvider; _serviceProvider = serviceProvider; } public async Task<string> RenderTemplateAsync<TModel>(string razorTemplate, TModel model) { // 定义虚拟视图路径,用于Razor引擎识别模板 var virtualViewPath = "/DynamicTemplates/CompiledTemplate.cshtml"; // 将字符串模板存入内存文件提供者 var fileProvider = new InMemoryFileProvider(); fileProvider.AddFile(virtualViewPath, razorTemplate); // 构建Razor编译引擎,添加必要的命名空间(包括自定义标签的命名空间) var razorEngine = RazorProjectEngine.Create(RazorConfiguration.Default, RazorProjectFileSystem.Create(fileProvider), builder => { builder.AddDefaultNamespaces(); // 替换为你的自定义标签所在命名空间 builder.AddNamespace("YourApp.CustomTagHelpers"); }); // 编译模板 var compilationResult = razorEngine.Compile(virtualViewPath); var viewDescriptor = new CompiledViewDescriptor(compilationResult); // 构建ViewContext所需的上下文对象 var actionContext = new ActionContext(new DefaultHttpContext { RequestServices = _serviceProvider }, new RouteData(), new ActionDescriptor()); var viewData = new ViewDataDictionary<TModel>(new EmptyModelMetadataProvider(), new ModelStateDictionary()) { Model = model }; var tempData = new TempDataDictionary(actionContext.HttpContext, _tempDataProvider); // 渲染模板到字符串 using var stringWriter = new StringWriter(); var razorView = new RazorView(_razorViewEngine, NullView.Instance, viewData, tempData, stringWriter, new HtmlHelperOptions()); await razorView.RenderAsync(new ViewContext(actionContext, razorView, viewData, tempData, stringWriter, new HtmlHelperOptions())); return stringWriter.ToString(); } } // 在Startup/Program中注册服务 services.AddScoped<DynamicRazorRenderer>(); services.AddMvc().AddRazorRuntimeCompilation();
方案2:使用社区维护的轻量库RazorLight
如果不需要依赖完整的ASP.NET Core MVC栈,可以选择RazorLight——这是一个专门用于动态Razor模板渲染的社区维护库,更新活跃,语法兼容Razor,支持自定义标签。
代码示例:
using RazorLight; public async Task<string> RenderTemplateWithRazorLight<TModel>(string razorTemplate, TModel model) { var engine = new RazorLightEngineBuilder() .UseMemoryCachingProvider() // 启用缓存提升重复渲染性能 .Build(); // 配置渲染选项,添加自定义标签命名空间 var renderOptions = new RenderOptions { AdditionalNamespaces = new List<string> { "YourApp.CustomTagHelpers" } }; // 编译并渲染模板,第一个参数为模板唯一标识(用于缓存) return await engine.CompileRenderStringAsync($"template-{Guid.NewGuid()}", razorTemplate, model, renderOptions); }
自定义标签支持说明
无论是原生API还是RazorLight,要支持自定义标签只需两步:
- 确保自定义标签类继承自
TagHelper并正确实现逻辑 - 在编译/渲染配置中添加自定义标签所在的命名空间(如上述代码中的
YourApp.CustomTagHelpers),或在模板开头添加@addTagHelper *, YourAssemblyName指令
内容的提问来源于stack exchange,提问作者kalit
相关产品推荐
相关产品推荐

