ASP.NET Core中使用Razor視圖引擎渲染視圖為字符串(轉)
阿新 • • 發佈:2018-05-19
http onf ces mod ado efault his .html 返回
一、視圖渲染說明
在有些項目需求上或許需要根據模板生產靜態頁面,那麽你一樣可以用Razor語法去直接解析你的頁面從而把解析的頁面生成靜態頁,這樣的使用場景很多,不限於生成靜態頁面,視圖引擎為我們提供了模型到視圖的代碼或文本生成的能力。
當然在MVC 4、5的時代,我們也使用過如RazorEngine這樣的第三方的視圖引擎,那時候MVC中的Razor與框架耦合的比較緊密,第三方開源組件幫我們實現了在任意項目中使用Razor渲染視圖為文本的方式;但是在.NET Core中 RazorEngine開源組件並沒有移植過來。
二、本示例,創建一個服務,用於處理將制定路徑的視圖和參數,解析成字符串
/// <summary>/// 定義視圖渲染服務 /// </summary> public class ViewRenderService : IViewRenderService { private readonly IRazorViewEngine _razorViewEngine; private readonly ITempDataProvider _tempDataProvider; private readonly IServiceProvider _serviceProvider; public ViewRenderService(IRazorViewEngine razorViewEngine, ITempDataProvider tempDataProvider, IServiceProvider serviceProvider) { _razorViewEngine= razorViewEngine; _tempDataProvider = tempDataProvider; _serviceProvider = serviceProvider; } public async Task<string> RenderToStringAsync(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.View == null) { throw new ArgumentNullException($"{viewName} does not match any available view"); } var viewDictionary = new ViewDataDictionary(new EmptyModelMetadataProvider(), new ModelStateDictionary()) { Model = model }; var viewContext = new ViewContext( actionContext, viewResult.View, viewDictionary, new TempDataDictionary(actionContext.HttpContext, _tempDataProvider), sw, new HtmlHelperOptions() ); await viewResult.View.RenderAsync(viewContext); return sw.ToString(); } } } public interface IViewRenderService { Task<string> RenderToStringAsync(string viewName, object model); }
使用過程:
1.註冊服務,在ConfigureServices() 中
//綁定服務, services.AddScoped<IViewRenderService, ViewRenderService>();
2.在控制器中通過服務調用方法
public class Emall1MvcController : Controller { private IViewRenderService _view = null; public Emall1MvcController(IViewRenderService view) { this._view= view; } public IActionResult Index() { return View(123); } //調用服務方法,返回html 字符串 public async Task<string> Test1() { return await _view.RenderToStringAsync("Emall1Mvc/Index", 456); } }
@model int @{ ViewData["Title"] = "Index"; } <h2>Index</h2> 測試變量如下: <p> @Model </p>
返回結果;
更多:
Asp.Net Core 自定義設置Http緩存處理
ASP.NET Core -中間件(Middleware)使用
Asp.Net Core 通過自定義中間件防止圖片盜鏈的實例(轉)
ASP.NET Core中使用Razor視圖引擎渲染視圖為字符串(轉)