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

ASP.NET Core 5如何渲染含TagHelper、ViewComponent的Razor字符串模板

ASP.NET Core 5 渲染含TagHelper/ViewComponent的Razor字符串模板方案

RazorLight本身为轻量Razor渲染实现,未集成完整MVC Razor管线,不支持TagHelper、ViewComponent这类依赖MVC上下文的特性,推荐使用ASP.NET Core 原生的IRazorViewEngine实现,原生支持所有Razor语法特性,具体实现步骤如下:

步骤1:注册依赖服务

如果项目未启用MVC相关服务,先在Startup.cs的ConfigureServices中添加服务注册:

services.AddControllersWithViews();
// 注册自定义渲染服务
services.AddScoped<IRazorTemplateRenderer, RazorTemplateRenderer>();

步骤2:实现Razor模板渲染服务

首先定义服务接口:

public interface IRazorTemplateRenderer
{
    /// <summary>
    /// 渲染Razor字符串模板为HTML
    /// </summary>
    /// <typeparam name="TModel">模板模型类型</typeparam>
    /// <param name="templateContent">Razor模板字符串内容</param>
    /// <param name="model">模型实例</param>
    /// <returns>渲染后的HTML字符串</returns>
    Task<string> RenderStringAsync<TModel>(string templateContent, TModel model);
}

然后实现接口,核心逻辑是构造完整的Razor渲染上下文,支持所有原生Razor特性:

public class RazorTemplateRenderer : IRazorTemplateRenderer
{
    private readonly IRazorViewEngine _razorViewEngine;
    private readonly ITempDataProvider _tempDataProvider;
    private readonly IServiceProvider _serviceProvider;

    public RazorTemplateRenderer(IRazorViewEngine razorViewEngine,
        ITempDataProvider tempDataProvider,
        IServiceProvider serviceProvider)
    {
        _razorViewEngine = razorViewEngine;
        _tempDataProvider = tempDataProvider;
        _serviceProvider = serviceProvider;
    }

    public async Task<string> RenderStringAsync<TModel>(string templateContent, TModel model)
    {
        // 非请求场景下手动构造HttpContext
        var httpContext = new DefaultHttpContext { RequestServices = _serviceProvider };
        var actionContext = new ActionContext(httpContext, new RouteData(), new ActionDescriptor());

        // 构造包装字符串模板的自定义视图
        var view = new RazorStringView(templateContent);

        using var sw = new StringWriter();
        var viewContext = new ViewContext(
            actionContext,
            view,
            new ViewDataDictionary<TModel>(new EmptyModelMetadataProvider(), new ModelStateDictionary())
            {
                Model = model
            },
            new TempDataDictionary(actionContext.HttpContext, _tempDataProvider),
            sw,
            new HtmlHelperOptions()
        );

        // 渲染视图到输出流
        await view.RenderAsync(viewContext);
        return sw.ToString();
    }

    // 自定义IView实现,直接读取传入的模板字符串
    private class RazorStringView : IView
    {
        private readonly string _templateContent;
        public string Path => nameof(RazorStringView);

        public RazorStringView(string templateContent)
        {
            _templateContent = templateContent;
        }

        public async Task RenderAsync(ViewContext context)
        {
            await context.Writer.WriteAsync(_templateContent);
        }
    }
}

步骤3:调用渲染服务

在需要渲染的位置注入IRazorTemplateRenderer,直接传入你的模板即可:

// 你的Razor模板内容
var template = @"
@model int
@addTagHelper *, MyProject 
<div class=""AAA""><PartialTest some-id=""@Model"" /></div>
@{await Component.InvokeAsync(""Products"");}
";

// 渲染模板,模型传入10
string htmlResult = await _razorTemplateRenderer.RenderStringAsync(template, 10);

注意事项

  • 可以基于模板内容的哈希值做缓存键,缓存编译后的视图实例,避免每次请求都重新编译模板,大幅提升重复渲染的性能
  • 确保模板中@addTagHelper指定的程序集名称和TagHelper所在的实际程序集名称一致,否则会出现TagHelper不生效的问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 15:18:03