如何在.NET 6中使用Razor渲染器?迁移后功能异常求解
解决方案
方案一:配置RazorLight导入系统命名空间
RazorLight默认未导入常用系统命名空间,手动添加后即可使用Convert、Math等方法:
- 安装RazorLight NuGet包
- 初始化引擎时添加默认命名空间:
var engine = new RazorLightEngineBuilder() .UseMemoryCachingProvider() .AddDefaultNamespaces("System") .AddDefaultNamespaces("System.Globalization") .Build();
- 渲染外部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兼容性更好,原生支持所有系统类:
- 安装NuGet包:
Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation - 在Program.cs注册服务:
builder.Services.AddControllersWithViews() .AddRazorRuntimeCompilation();
- 封装字符串渲染服务:
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(); } }
- 注册并使用服务:
// 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
相关产品推荐
相关产品推荐

