Razor 模板自己渲染出结果 string
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.AspNetCore.Mvc.Razor; using Microsoft.AspNetCore.Mvc.Rendering; using Microsoft.AspNetCore.Mvc.ViewFeatures; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; namespace XXX { public class ViewRenderService { IRazorViewEngine _viewEngine; IHttpContextAccessor _httpContextAccessor; public ViewRenderService(IRazorViewEngine viewEngine, IHttpContextAccessor httpContextAccessor) { _viewEngine = viewEngine; _httpContextAccessor = httpContextAccessor; } public string Render( string viewPath) { return Render(viewPath, string .Empty); } public string Render<TModel>( string viewPath, TModel model) { var viewEngineResult = _viewEngine.GetView( "~/" , viewPath, false ); if (!viewEngineResult.Success) { throw new InvalidOperationException($ "Couldn't find view {viewPath}" ); } var view = viewEngineResult.View; using ( var output = new StringWriter()) { var viewContext = new ViewContext(); viewContext.HttpContext = _httpContextAccessor.HttpContext; viewContext.ViewData = new ViewDataDictionary<TModel>( new EmptyModelMetadataProvider(), new ModelStateDictionary()) { Model = model }; viewContext.Writer = output; view.RenderAsync(viewContext).GetAwaiter().GetResult(); return output.ToString(); } } } } |
在 Startup.cs 里注册这个 service 类
1 | services.AddTransient<ViewRenderService>(); |
在 controller 类中定义使用
1 2 3 4 5 6 | public class FriendlylinksController : BaseController { private readonly ViewRenderService _viewRender; public FriendlylinksController(ViewRenderService viewRender) { _viewRender = viewRender; } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架