2023年如何将ASP.NET MVC Razor视图渲染为字符串?加载类型错误求助
Razor编译视图为字符串时加载WindowsImpersonationContext失败的解决办法
你尝试通过RazorEngine将视图编译为字符串用于邮件内容,使用代码:
string body = Engine.Razor.RunCompile(template,"templateKey",null,model);
出现错误:
无法加载类型'System.Security.Principal.WindowsImpersonationContext
以下是几种解决思路:
版本兼容性检查
该错误大概率是RazorEngine版本与当前项目的.NET框架不匹配导致的。如果你使用的是.NET Core/.NET 5+,部分旧版RazorEngine依赖.NET Framework专属类型,会引发加载失败。建议更换为适配当前框架的RazorEngine版本,或直接改用ASP.NET Core原生的Razor视图渲染能力。改用ASP.NET Core原生视图渲染
对于ASP.NET Core项目,无需依赖第三方库,直接使用框架自带的IRazorViewEngine即可稳定渲染视图为字符串。示例代码如下:private readonly IRazorViewEngine _razorViewEngine; private readonly ITempDataProvider _tempDataProvider; private readonly IServiceProvider _serviceProvider; public YourService(IRazorViewEngine razorViewEngine, ITempDataProvider tempDataProvider, IServiceProvider serviceProvider) { _razorViewEngine = razorViewEngine; _tempDataProvider = tempDataProvider; _serviceProvider = serviceProvider; } public async Task<string> RenderViewToStringAsync(string viewName, object model) { var httpContext = new DefaultHttpContext { RequestServices = _serviceProvider }; var actionContext = new ActionContext(httpContext, new RouteData(), new ActionDescriptor()); using var sw = new StringWriter(); var viewResult = _razorViewEngine.FindView(actionContext, viewName, false); if (!viewResult.Success) { throw new InvalidOperationException($"找不到指定视图: {viewName}"); } var viewData = new ViewDataDictionary(new EmptyModelMetadataProvider(), new ModelStateDictionary()) { Model = model }; var viewContext = new ViewContext( actionContext, viewResult.View, viewData, new TempDataDictionary(httpContext, _tempDataProvider), sw, new HtmlHelperOptions() ); await viewResult.View.RenderAsync(viewContext); return sw.ToString(); }调整RazorEngine配置(若坚持使用)
如果你需要继续使用RazorEngine,可通过初始化配置规避兼容性问题:var config = new TemplateServiceConfiguration { Language = Language.CSharp, CompilerServiceFactory = new RoslynCompilerServiceFactory() }; Engine.Razor = RazorEngineService.Create(config);同时确保项目已安装
System.Security.Principal.WindowsNuGet包(针对.NET Core项目)。
内容的提问来源于stack exchange,提问作者Vlad Pirvan
相关产品推荐
相关产品推荐

