- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using System.web;
- using System.Web.Compilation;
- using System.Web.Mvc;
- using System.Web.WebPages;
- namespace My_Blog.Controllers
- {
- public class ViewRenderController : Controller
- {
- // GET: ViewRender
- public void Index()
- {
- var path = "";
- var viewEngineResult = this.FindView(out path);// 查找 View
- Render(viewEngineResult, path);// 渲染 View
- }
- //View 的查找, 相当于 RazorViewEngine
- private ViewEngineResult FindView(out string path)
- {
- var actionName = "Contact";
- var controllerName = "Home";
- var viewLocationFormat = @"~/Views/{1}/{0}.cshtml";
- // 根据 Controller 和 Action 名称与地址模板组成 View 相对路径
- path = string.Format(viewLocationFormat, actionName, controllerName);
- // 根据文件路径创建 RazorView 和 ViewEngineResult
- var view = new RazorView(this.ControllerContext, path, "", true, null, null);
- return new ViewEngineResult(view, new RazorViewEngine());
- }
- //View 的渲染
- private void Render(ViewEngineResult viewEngineResult,string path)
- {
- Type pageType = BuildManager.GetCompiledType(path);// 根据对 View 文件进行编译
- var pageInstance = Activator.CreateInstance(pageType);// 创建 View 文件编译后类型实例
- var webViewPage = this.InitViewPage(pageInstance, viewEngineResult, path);// 对实例中相关属性进行初始化
- webViewPage.ExecutePageHierarchy(// 完成 View 的渲染
- new WebPageContext(this.HttpContext, null, null),
- this.HttpContext.Response.Output, null);//startpage 设置为 null, 将不会渲染布局页面
- }
- private WebViewPage InitViewPage(object instance, ViewEngineResult viewEngineResult, string path)
- {
- WebViewPage webViewPage = instance as WebViewPage;
- if (webViewPage == null)
- {
- throw new InvalidOperationException("无效");
- }
- ViewContext viewContext = new ViewContext(this.ControllerContext,
- viewEngineResult.View,
- this.ViewData,
- this.TempData,
- this.HttpContext.Response.Output);
- webViewPage.VirtualPath = path;
- webViewPage.ViewContext = viewContext;
- webViewPage.ViewData = viewContext.ViewData;
- webViewPage.InitHelpers();
- return webViewPage;
- }
- }
- }
来源: https://www.cnblogs.com/selimsong/p/8670744.html