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

如何在.NET 6中使用Razor渲染器?迁移后功能异常求解

解决方案

方案一:配置RazorLight导入系统命名空间

RazorLight默认未导入常用系统命名空间,手动添加后即可使用Convert、Math等方法:

  1. 安装RazorLight NuGet包
  2. 初始化引擎时添加默认命名空间:
var engine = new RazorLightEngineBuilder()
    .UseMemoryCachingProvider()
    .AddDefaultNamespaces("System")
    .AddDefaultNamespaces("System.Globalization")
    .Build();
  1. 渲染外部HTML字符串:
// 外部传入的带Razor语法的HTML
string externalHtml = "<p>金额:@Math.Round(Convert.ToDecimal(Model.Amount), 2) 元</p>";
var model = new { Amount = 99.987 };

// 编译并渲染
string renderedHtml = await engine.CompileRenderStringAsync("unique_template_key", externalHtml, model);

方案二:使用.NET官方Razor运行时编译服务

官方的Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation兼容性更好,原生支持所有系统类:

  1. 安装NuGet包:Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
  2. 在Program.cs注册服务:
builder.Services.AddControllersWithViews()
    .AddRazorRuntimeCompilation();
  1. 封装字符串渲染服务:
public class RazorStringRenderer
{
    private readonly IRazorViewEngine _viewEngine;
    private readonly IServiceProvider _serviceProvider;
    private readonly ITempDataProvider _tempDataProvider;

    public RazorStringRenderer(IRazorViewEngine viewEngine, IServiceProvider serviceProvider, ITempDataProvider tempDataProvider)
    {
        _viewEngine = viewEngine;
        _serviceProvider = serviceProvider;
        _tempDataProvider = tempDataProvider;
    }

    public async Task<string> RenderAsync(string razorContent, object model)
    {
        var httpContext = new DefaultHttpContext { RequestServices = _serviceProvider };
        var actionContext = new ActionContext(httpContext, new RouteData(), new ActionDescriptor());

        using var sw = new StringWriter();
        var templateEngine = _viewEngine.Engine;
        var sourceDoc = RazorSourceDocument.Create(razorContent, "temp_template.cshtml");
        var codeDoc = templateEngine.Process(sourceDoc);
        var compiledType = codeDoc.GeneratedCode.Compile();
        var view = (IView)Activator.CreateInstance(compiledType, _viewEngine);

        var viewContext = new ViewContext(
            actionContext,
            view,
            new ViewDataDictionary(new EmptyModelMetadataProvider(), new ModelStateDictionary()) { Model = model },
            new TempDataDictionary(httpContext, _tempDataProvider),
            sw,
            new HtmlHelperOptions()
        );

        await view.RenderAsync(viewContext);
        return sw.ToString();
    }
}
  1. 注册并使用服务:
// Program.cs注册
builder.Services.AddScoped<RazorStringRenderer>();

// 使用时注入服务
public class YourController : ControllerBase
{
    private readonly RazorStringRenderer _renderer;

    public YourController(RazorStringRenderer renderer)
    {
        _renderer = renderer;
    }

    [HttpPost]
    public async Task<IActionResult> RenderHtml([FromBody] string externalHtml)
    {
        var model = new { /* 你的模型数据 */ };
        string rendered = await _renderer.RenderAsync(externalHtml, model);
        return Ok(rendered);
    }
}

方案三:修复RazorEngine.NET Core版本的空参数错误

如果坚持使用原RazorEngine,需确保初始化时参数完整,同时添加系统命名空间:

var config = new TemplateServiceConfiguration
{
    // 必须设置模板管理器,避免空参数错误
    TemplateManager = new ResolvePathTemplateManager(new[] { Directory.GetCurrentDirectory() }),
    // 添加需要的命名空间
    Namespaces = { "System", "System.Math", "System.Convert" }
};

var service = RazorEngineService.Create(config);
string renderedHtml = service.RunCompile(externalHtml, "template_key", null, model);

补充:RazorEngineCore的命名空间配置

如果用RazorEngineCore,需手动导入系统命名空间:

var engine = new RazorEngineCore.RazorEngine();
// 全局添加命名空间
engine.DefaultNamespaces.Add("System");

// 编译并渲染
var template = await engine.CompileAsync(externalHtml);
string result = template.Run(model);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 17:45:58