利用AspNetCore MVC的Razor引擎來做前端模版
阿新 • • 發佈:2020-10-08
單獨版本的用起來像是後媽生的
搞個擴充套件,用於輸出模版字串
//https://stackoverflow.com/questions/40912375/return-view-as-string-in-net-core using Microsoft.AspNetCore.Hosting; 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; public static class ControllerExtensions { public static async Task<string> RenderViewAsync<TModel>(this Controller controller, string viewName, TModel model, bool isPartial = 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 = GetViewEngineResult(controller, viewName, isPartial, viewEngine); if (viewResult.Success == false) { throw new System.Exception($"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(); } } private static ViewEngineResult GetViewEngineResult(Controller controller, string viewName, bool isPartial, IViewEngine viewEngine) { if (viewName.StartsWith("~/")) { var hostingEnv = controller.HttpContext.RequestServices.GetService(typeof(IHostingEnvironment)) as IHostingEnvironment; return viewEngine.GetView(hostingEnv.WebRootPath, viewName, !isPartial); } else { return viewEngine.FindView(controller.ControllerContext, viewName, !isPartial); } } }
準備在這裡寫事件,把其他模版進行編譯,每次按F5把所有的cshtml都儲存成.html靜態檔案
public class HomeController : Controller { public async Task<IActionResult> IndexAsync() { var html = await this.RenderViewAsync("~/Views/Home/Index.cshtml", new { }); Console.WriteLine(html); return View(); } }