You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何渲染字符串Razor页面为字符串?实现自定义模板数据库存储

动态Razor字符串渲染方案(替代停更的RazorEngine)

完全可以实现需求,以下是几种基于ASP.NET生态的可靠方案:

方案1:基于ASP.NET Core原生Razor编译API实现

ASP.NET Core本身提供了底层的Razor编译能力,无需依赖第三方库即可直接编译并渲染字符串形式的Razor模板,支持自定义标签。

实现步骤:

  1. 引用Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation NuGet包
  2. 编写渲染服务类,利用RazorProjectEngine处理虚拟字符串模板
  3. 注册服务并注入使用

代码示例:

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,要支持自定义标签只需两步:

  1. 确保自定义标签类继承自TagHelper并正确实现逻辑
  2. 在编译/渲染配置中添加自定义标签所在的命名空间(如上述代码中的YourApp.CustomTagHelpers),或在模板开头添加@addTagHelper *, YourAssemblyName指令

内容的提问来源于stack exchange,提问作者kalit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 21:54:56