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 类
services.AddTransient<ViewRenderService>();
在 controller 类中定义使用
public class FriendlylinksController : BaseController { private readonly ViewRenderService _viewRender; public FriendlylinksController(ViewRenderService viewRender) { _viewRender = viewRender; } }