zoukankan      html  css  js  c++  java
  • ASP.NET MVC 利用Razor引擎生成静态页

    实现原理及步骤:

    1.通过ViewEngines.Engines.FindView查找到对应的视图,如果是部分视图,则用:ViewEngines.Engines.FindPartialView;

    2.设置上下文对象里的Model;

    3.调用视图的Render()方法,将渲染结果保存到物理静态文件;

    使用视图引擎进行静态化操作,主要使用到了两个类:ViewEngines类ViewContext类。通过ViewEngines类的FindView方法或FindPartialView方法找到要进行静态化的视图页面,然后使用ViewContext类将数据模型填充到视图模板中,获取页面内容后生成静态页面。

    ViewContext类主要是封装与呈现视图相关的信息。

    这里引用ASP.NET MVC 5 高级编程的相关资料:

    1. 视图引擎是一个静态的ViewEngineCollection类型对象,可以包含所有已注册的视图引擎。
    2. FindView方法迭代ViewEngineCollection中注册的视图引擎,并在每个视图引擎上调用FindView方法,并把视图名称作为参数传入。这就是ViewEngineCollection询问每个视图引擎能否渲染指定视图的方式。
    3. FindPartialView方式的工作机制与FindView几乎一样,只是它关注于查找部分视图。
    /// <summary>  
    /// 描述:静态页面生成帮助类  
    /// </summary>  
    public class StaticPageHelper
    {
        /// <summary>  
        /// 根据View视图生成静态页面  
        /// </summary>  
        /// <param name="htmlPath">存放静态页面所在绝对路径</param>  
        /// <param name="context">ControllerContext</param>  
        /// <param name="viewPath">视图名称</param>  
        /// <param name="masterName">模板视图名称</param>  
        /// <param name="model">参数实体模型</param>  
        /// <param name="html">返回信息</param>  
        /// <param name="isPartial">是否分布视图</param>  
        /// <returns>生成成功返回true,失败false</returns>  
        public static AjaxResult GenerateStaticPage(string viewPath,string htmlPath,ControllerContext context, object model = null, bool isPartial = false,string masterName = "")
        {
            var ajaxResult = new AjaxResult();
            try
            {
                //创建存放静态页面目录                              
                if (!Directory.Exists(Path.GetDirectoryName(htmlPath)))
                {
                    Directory.CreateDirectory(Path.GetDirectoryName(htmlPath));
                }
                //删除已有的静态页面  
                if (File.Exists(htmlPath))
                {
                    File.Delete(htmlPath);
                }
                ViewEngineResult result = null;
                //通过ViewEngines.Engines.FindView查找到对应的视图,如果是部分视图,则用:ViewEngines.Engines.FindPartialView
                if (isPartial)
                {
                    result = ViewEngines.Engines.FindPartialView(context, viewPath);
                }
                else
                {
                    result = ViewEngines.Engines.FindView(context, viewPath, masterName);
                }
    
                if (model != null)
                {
                    context.Controller.ViewData.Model = model;
                }
    
                /* 
                    * 设置临时数据字典作为静态化标识 
                    * 可以在视图上使用TempData["IsStatic"]来控制某些元素显示。 
                    */
                if (!context.Controller.TempData.ContainsKey("IsStatic"))
                {
                    context.Controller.TempData.Add("IsStatic", true);
                }
    
                if (result.View != null)
                {
                    using (var sw = new StringWriter())
                    {
                        var viewContext = new ViewContext(context,result.View,context.Controller.ViewData,context.Controller.TempData, sw);
                        //调用视图的Render()方法,将渲染结果保存到物理静态文件
                        result.View.Render(viewContext, sw);
    
                        string body = sw.ToString();
                        File.WriteAllText(htmlPath, body, Encoding.UTF8);
                        ajaxResult.IsSucess = true;
                        ajaxResult.Body = "存放路径:" + htmlPath;
                    }
                }
                else
                {
                    ajaxResult.IsSucess = false;
                    ajaxResult.Body = "生成静态页面失败!未找到视图!";
                }
            }
            catch (IOException ex)
            {
                ajaxResult.IsSucess = false;
                ajaxResult.Body = ex.Message;
            }
            catch (Exception ex)
            {
                ajaxResult.IsSucess = false;
                ajaxResult.Body = ex.Message;
            }
            return ajaxResult;
        }
    }
    
    public class AjaxResult
    {
        public bool IsSucess { get; set; }
        public string Body { get; set; }
    }

    调用,可以先判执行后的ajaxResult.IsSucess是否为true再进行调用:

    StaticPageHelper.GenerateStaticPage("/Views/Html/CommandAd/CommandAdList.cshtml", Server.MapPath("/Static/Mobile/Home/CommandList.html"), ControllerContext, view_Person, true);
  • 相关阅读:
    ACM ICPC 2008–2009 NEERC MSC A, B, C, G, L
    POJ 1088 滑雪 DP
    UVA 11584 最短回文串划分 DP
    POJ 2531 Network Saboteur DFS+剪枝
    UVa 10739 String to Palindrome 字符串dp
    UVa 11151 Longest Palindrome 字符串dp
    UVa 10154 Weights and Measures dp 降维
    UVa 10271 Chopsticks dp
    UVa 10617 Again Palindrome 字符串dp
    UVa 10651 Pebble Solitaire 状态压缩 dp
  • 原文地址:https://www.cnblogs.com/genesis/p/6562272.html
Copyright © 2011-2022 走看看