91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

ASP.NET MVC中怎么利用RazorEngine生成靜態頁

發布時間:2021-07-15 16:43:42 來源:億速云 閱讀:250 作者:Leah 欄目:開發技術

今天就跟大家聊聊有關ASP.NET MVC中怎么利用RazorEngine生成靜態頁,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

一、創建一個MVC項目,并且添加上面的兩個DLL引用,然后我們新建一個簡單的文章類

public class Articles
 {
 /// <summary>
 /// 文章ID
 /// </summary>
 public int Id { get; set; }
 /// <summary>
 /// 文章標題
 /// </summary>
 public string Title { get; set; }
 /// <summary>
 /// 文章內容
 /// </summary>
 public string Content { get; set; }
 /// <summary>
 /// 作者
 /// </summary>
 public string Author { get; set; }
 /// <summary>
 /// 發布時間
 /// </summary>
 public DateTime CreateDate { get; set; }
 }

二、我們新建一個Razor的Html模板

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
 <title>@Model.Title</title>
</head>
<body>
 <h2>@Model.Title</h2>
 <p>作者:@Model.Author - 發布時間:@Model.CreateDate</p>
 <p>@Raw(Model.Content)</p>
</body>
</html>

說明:Model就是我們的文章實體類  在MVC的試圖頁cshtml中 我們一般都是在控制器里傳遞這個實體類 然后在視圖頁中 @model Models.Articles 來接收這個實體類 然后通過“@Model.”來輸出內容,在Razor模板中是一樣的,只是不用@model Models.Articles 來接收了,其它的語法跟在.cshtml試圖頁中是一樣的,這么說多余了,因為寫法不一樣他就不是Razor了

三、我們寫一個方法來獲取模板頁的Html代碼

 /// <summary>
 /// 獲取頁面的Html代碼
 /// </summary>
 /// <param name="url">模板頁面路徑</param>
 /// <param name="encoding">頁面編碼</param>
 /// <returns></returns>
 public string GetHtml(string url, System.Text.Encoding encoding)
 {
  byte[] buf = new WebClient().DownloadData(url);
  if (encoding != null) return encoding.GetString(buf);
  string html = System.Text.Encoding.UTF8.GetString(buf);
  encoding = GetEncoding(html);
  if (encoding == null || encoding == System.Text.Encoding.UTF8) return html;
  return encoding.GetString(buf);
 }

 /// <summary>
 /// 獲取頁面的編碼
 /// </summary>
 /// <param name="html">Html源碼</param>
 /// <returns></returns>
 public System.Text.Encoding GetEncoding(string html)
 {
  string pattern = @"(?i)\bcharset=(?<charset>[-a-zA-Z_0-9]+)";
  string charset = Regex.Match(html, pattern).Groups["charset"].Value;
  try { return System.Text.Encoding.GetEncoding(charset); }
  catch (ArgumentException) { return null; }
 }

四、我們寫一個方法 用于生成Html靜態頁

/// <summary>
 /// 創建靜態文件
 /// </summary>
 /// <param name="result">Html代碼</param>
 /// <param name="createpath">生成路徑</param>
 /// <returns></returns>
 public bool CreateFileHtmlByTemp(string result, string createpath)
 {
  if (!string.IsNullOrEmpty(result))
  {
  if (string.IsNullOrEmpty(createpath))
  {
   createpath = "/default.html";
  }
  string filepath = createpath.Substring(createpath.LastIndexOf(@"\"));
  createpath = createpath.Substring(0, createpath.LastIndexOf(@"\"));
  if (!Directory.Exists(createpath))
  {
   Directory.CreateDirectory(createpath);
  }
  createpath = createpath + filepath;
  try
  {
   FileStream fs2 = new FileStream(createpath, FileMode.Create);
   StreamWriter sw = new StreamWriter(fs2, new System.Text.UTF8Encoding(false));//去除UTF-8 BOM
   sw.Write(result);
   sw.Close();
   fs2.Close();
   fs2.Dispose();
   return true;
  }
  catch { return false; }
  }
  return false;
 }

五、我們來寫個方法調用靜態模板,并且傳遞數據模型實體類 創建Html靜態頁

/// <summary>
 /// 解析模板生成靜態頁
 /// </summary>
 /// <param name="temppath">模板地址</param>
 /// <param name="path">靜態頁地址</param>
 /// <param name="t">數據模型</param>
 /// <returns></returns>
 public bool CreateStaticPage(string temppath, string path, RazorEngineTemplates.Models.Articles t)
 {
  try
  {
  //獲取模板Html
  string TemplateContent = GetHtml(temppath, System.Text.Encoding.UTF8);

  //初始化結果
  string result = string.Empty;

  //解析模板生成靜態頁Html代碼
  result = Razor.Parse(TemplateContent, t);

  //創建靜態文件
  return CreateFileHtmlByTemp(result, path);
  }
  catch (Exception e)
  {
  throw e;
  }
 }

好了,大功告成,是不是很簡單。

ASP.NET MVC中怎么利用RazorEngine生成靜態頁

這里只是一個很簡單的應用,沒有讀取數據,也沒有列表,只有一個文章數據模型,下一部分我們將介紹 多模型模板解析,因為是多模型 所以 生成靜態頁面的時候 就不是傳遞一個具體模型實體類 我們會用到 反射,通過反射模型屬性 獲取數據,有不熟悉反射的可以提前研究一下,也可以直接看下一部分的反射代碼也很簡單的。

第二部分 面向接口的多數據模型模板解析

這一部分,我們介紹使用接口來解析模板,包括列表等多種模型解析,用到了Spring注入和反射還有接口等,有不熟悉的可以百度搜一下或者評論留言。

我們接著上面的示例,我們新建兩個類庫 一個是存放數據模型的 我們叫Domain;另外一個是接口和實現類的 我們叫Service,然后我們添加他們之間的引用

一、我們在Domain下創建幾個測試類

Articles - 文章測試類

Company - 公司測試類

Column - 欄目測試類

TemplateView - 模型解析類(這個是不是比較弱智?我也沒深入研究多個模型怎么反射出來 所以 我加了這么個算是公用的類 沒有對應的數據表 只是解析模板的時候 作為中間件用用)

public class Articles
 {
 /// <summary>
 /// 文章ID
 /// </summary>
 public int Id { get; set; }
 /// <summary>
 /// 文章標題
 /// </summary>
 public string Title { get; set; }
 /// <summary>
 /// 文章內容
 /// </summary>
 public string Content { get; set; }
 /// <summary>
 /// 作者
 /// </summary>
 public string Author { get; set; }
 /// <summary>
 /// 發布時間
 /// </summary>
 public DateTime CreateDate { get; set; }
 }
  public class Company
 {
 /// <summary>
 /// 公司Id
 /// </summary>
 public int Id { get; set; }
 /// <summary>
 /// 公司名稱
 /// </summary>
 public string CompanyName { get; set; }
 /// <summary>
 /// 公司電話
 /// </summary>
 public string CompanyTel { get; set; }
 /// <summary>
 /// 聯系人
 /// </summary>
 public string ContectUser { get; set; }
 /// <summary>
 /// 創建時間
 /// </summary>
 public DateTime CreateDate { get; set; }
 }
   public class Column
 {
 /// <summary>
 /// 欄目ID
 /// </summary>
 public int Id { get; set; }
 /// <summary>
 /// 欄目名稱
 /// </summary>
 public string Title { get; set; }
 /// <summary>
 /// 文章列表
 /// </summary>

 public virtual ICollection<Articles> Articles { get; set; }
 }
   public class TemplateView
 {
 /// <summary>
 /// ID
 /// </summary>
 public int Id { get; set; }
 /// <summary>
 /// 標題
 /// </summary>
 public string Title { get; set; }
 /// <summary>
 /// 內容
 /// </summary>
 public string Content { get; set; }
 /// <summary>
 /// 作者
 /// </summary>
 public string Author { get; set; }
 /// <summary>
 /// 時間
 /// </summary>
 public DateTime CreateDate { get; set; } 
 /// <summary>
 /// 公司名稱
 /// </summary>
 public string CompanyName { get; set; }
 /// <summary>
 /// 公司電話
 /// </summary>
 public string CompanyTel { get; set; }
 /// <summary>
 /// 聯系人
 /// </summary>
 public string ContectUser { get; set; }
 /// <summary>
 /// 文章列表
 /// </summary>
 public virtual ICollection<Articles> Articles { get; set; }
 }

二、我們在Service下創建一個基礎操作接口以及其實現類(里面的很多方法 比如:獲取頁面的Html代碼、獲取頁面的編碼以及創建靜態文件等 是沒有必要寫在接口的 這個可以寫到公用的類庫里,因為這里就用到這么幾個方法 所以我沒有加公用類庫 就直接寫在這里面了)

/// <summary>
 /// 基礎操作接口
 /// </summary>
 /// <typeparam name="T"></typeparam>
 public interface IRepository<T> where T : class
 {
 /// <summary>
 /// 解析模板生成靜態頁
 /// </summary>
 /// <param name="temppath">模板地址</param>
 /// <param name="path">靜態頁地址</param>
 /// <param name="t">數據模型</param>
 /// <returns></returns>
 bool CreateStaticPage(string temppath, string path, T t); 

 /// <summary>
 /// 獲取頁面的Html代碼
 /// </summary>
 /// <param name="url">模板頁面路徑</param>
 /// <param name="encoding">頁面編碼</param>
 /// <returns></returns>
 string GetHtml(string url, System.Text.Encoding encoding);

 /// <summary>
 /// 獲取頁面的編碼
 /// </summary>
 /// <param name="html">Html源碼</param>
 /// <returns></returns>
 System.Text.Encoding GetEncoding(string html);

 /// <summary>
 /// 創建靜態文件
 /// </summary>
 /// <param name="result">Html代碼</param>
 /// <param name="createpath">生成路徑</param>
 /// <returns></returns>
 bool CreateFileHtmlByTemp(string result, string createpath);
 }
/// <summary>
 /// 基礎接口實現類
 /// </summary>
 /// <typeparam name="T"></typeparam>
 public abstract class RepositoryBase<T> : IRepository<T> where T : class
 {
 /// <summary>
 /// 解析模板生成靜態頁
 /// </summary>
 /// <param name="temppath">模板地址</param>
 /// <param name="path">靜態頁地址</param>
 /// <param name="t">數據模型</param>
 /// <returns></returns>
 public bool CreateStaticPage(string temppath, string path, T t)
 {
  try
  {
  //實例化模型
  var Entity = new Domain.TemplateView();

  //獲取模板Html
  string TemplateContent = GetHtml(temppath, System.Text.Encoding.UTF8);
  //初始化結果
  string result = "";

  //反射賦值
  Type typeT = t.GetType();
  Type typeEn = Entity.GetType();

  System.Reflection.PropertyInfo[] propertyinfosT = typeT.GetProperties();

  foreach (System.Reflection.PropertyInfo propertyinfoT in propertyinfosT)
  {
   System.Reflection.PropertyInfo propertyinfoEn = typeEn.GetProperty(propertyinfoT.Name);
   if (propertyinfoEn != null && propertyinfoT.GetValue(t, null) != null)
   {
   propertyinfoEn.SetValue(Entity, propertyinfoT.GetValue(t, null), null);
   }
  }

  //很多時候 我們并沒有創建復雜的主外鍵關系 例如欄目下的文章 我們僅僅是在文章表中添加了一個所屬欄目ID的字段
  //并沒有創建關聯 這種情況下 我們直接獲取欄目的時候 是獲取不到文章列表的
  //包括很多自定義的模型和字段 比如 文章的內容 可能不跟文章一個表 而是一個單獨的大數據字段表 這種情況下 我們的
  //TemplateView.Content就需要單獨獲取一下另一個數據模型里的 這個文章的內容 這種時候 我們可以在這里重新給他賦值

  //如 傳入的模型是 文章
  //if(t is Domain.Articles)
  //{
  // Entity.Content= 查詢大數據字段表中這篇文章的內容;
   
  //}

  result = Razor.Parse(TemplateContent, Entity);

  return CreateFileHtmlByTemp(result, path);
  }
  catch (Exception e)
  {
  throw e;
  }
 }

 /// <summary>
 /// 獲取頁面的Html代碼
 /// </summary>
 /// <param name="url">模板頁面路徑</param>
 /// <param name="encoding">頁面編碼</param>
 /// <returns></returns>
 public string GetHtml(string url, System.Text.Encoding encoding)
 {
  byte[] buf = new WebClient().DownloadData(url);
  if (encoding != null) return encoding.GetString(buf);
  string html = System.Text.Encoding.UTF8.GetString(buf);
  encoding = GetEncoding(html);
  if (encoding == null || encoding == System.Text.Encoding.UTF8) return html;
  return encoding.GetString(buf);
 }

 /// <summary>
 /// 獲取頁面的編碼
 /// </summary>
 /// <param name="html">Html源碼</param>
 /// <returns></returns>
 public System.Text.Encoding GetEncoding(string html)
 {
  string pattern = @"(?i)\bcharset=(?<charset>[-a-zA-Z_0-9]+)";
  string charset = Regex.Match(html, pattern).Groups["charset"].Value;
  try { return System.Text.Encoding.GetEncoding(charset); }
  catch (ArgumentException) { return null; }
 }

 /// <summary>
 /// 創建靜態文件
 /// </summary>
 /// <param name="result">Html代碼</param>
 /// <param name="createpath">生成路徑</param>
 /// <returns></returns>
 public bool CreateFileHtmlByTemp(string result, string createpath)
 {
  if (!string.IsNullOrEmpty(result))
  {
  if (string.IsNullOrEmpty(createpath))
  {
   createpath = "/default.html";
  }
  string filepath = createpath.Substring(createpath.LastIndexOf(@"\"));
  createpath = createpath.Substring(0, createpath.LastIndexOf(@"\"));
  if (!Directory.Exists(createpath))
  {
   Directory.CreateDirectory(createpath);
  }
  createpath = createpath + filepath;
  try
  {
   FileStream fs2 = new FileStream(createpath, FileMode.Create);
   StreamWriter sw = new StreamWriter(fs2, new System.Text.UTF8Encoding(false));//去除UTF-8 BOM
   sw.Write(result);
   sw.Close();
   fs2.Close();
   fs2.Dispose();
   return true;
  }
  catch { return false; }
  }
  return false;
 }
 }

三、我們分別創建 文章管理、公司管理、欄目管理的接口和實現類 并且他們都集成基礎操作

   /// <summary>
 /// 文章管理
 /// </summary>
   public interface IArticleManage:IRepository<Domain.Articles>
 {
 }
 public class ArticleManage:RepositoryBase<Domain.Articles>,IArticleManage
 {
 }

  /// <summary>
 /// 公司管理
 /// </summary>
 public interface ICompanyManage:IRepository<Domain.Company>
 {
 }
  public class CompanyManage:RepositoryBase<Domain.Company>,ICompanyManage
 {
 }

  //欄目管理
 public interface IColumnManage:IRepository<Domain.Column>
 {
 }
  public class ColumnManage:RepositoryBase<Domain.Column>,IColumnManage
 {
 }

四、注入Xml

<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net">
 <description>Spring注入Service,容器指向本層層封裝的接口</description>
 <object id="Service.ArticleManage" type="Service.ArticleManage,Service" singleton="false">
 </object>
 <object id="Service.ColumnManage" type="Service.ColumnManage,Service" singleton="false">
 </object>
 <object id="Service.CompanyManage" type="Service.CompanyManage,Service" singleton="false">
 </object>
</objects>

五、我們分別初始化一個文章類、一個公司類(沒有管理數據表,它下面沒有文章列表 欄目模型我就不初始化了,怎么輸出列表 大家可以參考下 欄目模板)

public class HomeController : Controller
 {
 /// <summary>
 /// 聲明一下注入接口
 /// </summary>
 public IArticleManage ArticleManage = Spring.Context.Support.ContextRegistry.GetContext().GetObject("Service.ArticleManage") as IArticleManage;
 public ICompanyManage CompanyManage = Spring.Context.Support.ContextRegistry.GetContext().GetObject("Service.CompanyManage") as ICompanyManage;
 public IColumnManage ColumnManage = Spring.Context.Support.ContextRegistry.GetContext().GetObject("Service.ColumnManage") as IColumnManage;


 public ActionResult Index()
 {
  //初始化一個文章數據模型
  var entityArticle = new Domain.Articles() { Id = 1, Title = "這里是文章標題", Content = "<span style=\"color:red;\">這里是文章內容</span>", Author = "張三", CreateDate = DateTime.Now };

  //初始化一個公司數據模型
  var entityCompany = new Domain.Company() { Id = 1, CompanyName = "這里是公司名稱", CompanyTel = "公司電話", ContectUser = "張三", CreateDate = DateTime.Now };

  //調用方法生成靜態頁面
  ArticleManage.CreateStaticPage(Server.MapPath("/Templates/Temp_article.html"), Server.MapPath("/Pages/news/" + DateTime.Now.ToString("yyyyMMddHHmmss") + "1.html"), entityArticle);
  CompanyManage.CreateStaticPage(Server.MapPath("/Templates/Temp_company.html"), Server.MapPath("/Pages/news/" + DateTime.Now.ToString("yyyyMMddHHmmss") + "2.html"), entityCompany);

  return View();
 }

 public ActionResult About()
 {
  ViewBag.Message = "Your application description page.";

  return View();
 }

 public ActionResult Contact()
 {
  ViewBag.Message = "Your contact page.";

  return View();
 }
 
 }

六、這是測試的簡單的文章模板、公司模板和欄目模板

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <title>@Model.Title</title>
</head>
<body>
 <h2>@Model.Title</h2>
 <p>作者:@Model.Author - 發布時間:@Model.CreateDate</p>
 <p>@Raw(Model.Content)</p>
</body>
</html>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
 <title></title>
</head>
<body>
 <p>公司名稱:@Model.CompanyName</p>
 <p>公司電話:@Model.CompanyTel</p>
 <p>聯系人:@Model.ContectUser</p>
 <p>創建時間:@Model.CreateDate</p>
</body>
</html>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
 <title></title>
</head>
<body>
 <p>欄目標題: @Model.Title</p>
 <p>
 文章列表
 <ul>
  @foreach(var item in @Model.Articles)
  {
  <li>
  <a href="">
   <span>@item.Title</span>
   <span>@item.Author</span>
   <span>@item.CreateDate</span>
  </a>
  </li>
  }
 </ul>
 </p>
</body>
</html>

我們運行一下,大功告成~~~

        ASP.NET MVC中怎么利用RazorEngine生成靜態頁

怎么排序?怎么獲取前幾條?怎么格式化日期時間?怎么分頁?

這可是Razor啊,這都不需要再多講了吧,簡單一說,如果你傳入數據前沒有事先排序或者獲取前幾條,這些操作要做模板里操作 那跟在.cshtml里基本是一樣的

@foreach(var item in @Model.ListColumn)
{

 <div >
@if (@item.LinkUrl==null)
 {
 <ul>
@foreach(var article in @item.COM_ARTICLE.Take(15).OrderByDescending(p=>p.UpDateDate))
{

<li>
  <a href="@article.LinkUrl" class="gd-a">
  <div>@article.Title</div></a>
  </li>
}
 </ul>
 }
 else
 {

 }
</div>
}

看完上述內容,你們對ASP.NET MVC中怎么利用RazorEngine生成靜態頁有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

崇礼县| 诸城市| 交口县| 沅陵县| 祥云县| 东兰县| 葫芦岛市| 灵寿县| 隆德县| 辰溪县| 乳源| 鹤山市| 长子县| 荆门市| 凤山市| 南陵县| 峨边| 图片| 随州市| 金塔县| 玉门市| 行唐县| 大同县| 双城市| 和顺县| 长治县| 天峻县| 宣威市| 扶沟县| 长岛县| 安化县| 东乡县| 吉林省| 永和县| 旺苍县| 上思县| 土默特左旗| 平顶山市| 阜平县| 叙永县| 浦东新区|