ASP.NET MVC Razorエンジンによる静的ページ生成

4289 ワード

実現原理と手順:
1.ViewEnginesを通過する.Engines.FindViewは対応するビューを検索し、一部のビューであれば:ViewEngines.Engines.FindPartialView;
2.コンテキストオブジェクトのModelを設定します.
3.ビューのレンダー()メソッドを呼び出し、レンダリング結果を物理的な静的ファイルに保存します.
using System;
using System.IO;
using System.Text;
using System.Web.Mvc;

namespace Whir.Foundation.UI
{
    /// <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;
                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);

                        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;
        }
    }
}

AjaxResultは自分でカプセル化したクラスで、自分でカプセル化したクラスで代用することもできます.
    public class AjaxResult     {
        public bool IsSucess { get; set; }         public string Body { get; set; }
    }