下面的方法可以在ASP.NET Core MVC中,將視圖文件生成的html代碼通過字符串返回。
首先定義一個靜態類ControllerExtensions,里面包含Controller的擴展方法RenderViewAsync,用於返回視圖文件生成的html代碼:
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Rendering; using Microsoft.AspNetCore.Mvc.ViewEngines; using Microsoft.AspNetCore.Mvc.ViewFeatures; using System.IO; using System.Threading.Tasks; namespace AspNetCore3000ViewGenerator.Models { public static class ControllerExtensions { public static async Task<string> RenderViewAsync(this Controller controller, string viewName, object model, bool partial = false) { if (string.IsNullOrEmpty(viewName)) { viewName = controller.ControllerContext.ActionDescriptor.ActionName; } controller.ViewData.Model = model; using (var writer = new StringWriter()) { IViewEngine viewEngine = controller.HttpContext.RequestServices.GetService(typeof(ICompositeViewEngine)) as ICompositeViewEngine; ViewEngineResult viewResult = viewEngine.FindView(controller.ControllerContext, viewName, !partial); if (viewResult.Success == false) { return $"A view with the name {viewName} could not be found"; } ViewContext viewContext = new ViewContext( controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, writer, new HtmlHelperOptions() ); await viewResult.View.RenderAsync(viewContext); return writer.GetStringBuilder().ToString(); } } } }
然后可以在ASP.NET Core MVC的Controller中調用RenderViewAsync方法,返回一個視圖文件生成的html代碼:
using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using AspNetCore3000ViewGenerator.Models; namespace AspNetCore3000ViewGenerator.Controllers { public class HomeController : Controller { private readonly ILogger<HomeController> _logger; public HomeController(ILogger<HomeController> logger) { _logger = logger; } public async Task<IActionResult> Index() { this.ViewData["Message"] = "This is a demo message!";//在Controller中設置ViewData的值后,就可以在下面調用RenderViewAsync方法生成視圖Index.cshtml的html代碼時,在視圖Index.cshtml中獲取到ViewData的值 string html = await this.RenderViewAsync("Index", null);//獲取HomeController下,通過視圖Index.cshtml生成的html代碼 return View(); } } }
視圖Index.cshtml的代碼如下:
@{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Index</title> </head> <body> <div> <h1>Index view!</h1> </div> <div> @ViewData["Message"].ToString()<!--在視圖Index.cshtml中,獲取ViewData的值--> </div> </body> </html>
參考文獻:
Return View as String in .NET Core,特別是這個回復。