ASP.NET MVC Razorエンジンによる静的ページ生成
4289 ワード
実現原理と手順:
1.ViewEnginesを通過する.Engines.FindViewは対応するビューを検索し、一部のビューであれば:ViewEngines.Engines.FindPartialView;
2.コンテキストオブジェクトのModelを設定します.
3.ビューのレンダー()メソッドを呼び出し、レンダリング結果を物理的な静的ファイルに保存します.
AjaxResultは自分でカプセル化したクラスで、自分でカプセル化したクラスで代用することもできます.
public class AjaxResult {
public bool IsSucess { get; set; } public string Body { get; set; }
}
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; }
}