ASP.NETMVC中怎么利用RazorEngine生成静态页-创新互联

今天就跟大家聊聊有关ASP.NET MVC中怎么利用RazorEngine生成静态页,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

为阳江等地区用户提供了全套网页设计制作服务,及阳江网站建设行业解决方案。主营业务为网站设计、成都网站制作、阳江网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!

一、创建一个MVC项目,并且添加上面的两个DLL引用,然后我们新建一个简单的文章类

public class Articles
 {
 /// 
 /// 文章ID
 /// 
 public int Id { get; set; }
 /// 
 /// 文章标题
 /// 
 public string Title { get; set; }
 /// 
 /// 文章内容
 /// 
 public string Content { get; set; }
 /// 
 /// 作者
 /// 
 public string Author { get; set; }
 /// 
 /// 发布时间
 /// 
 public DateTime CreateDate { get; set; }
 }

二、我们新建一个Razor的Html模板





 @Model.Title


 

@Model.Title

 

作者:@Model.Author - 发布时间:@Model.CreateDate

 

@Raw(Model.Content)

说明:Model就是我们的文章实体类  在MVC的试图页cshtml中 我们一般都是在控制器里传递这个实体类 然后在视图页中 @model Models.Articles 来接收这个实体类 然后通过“@Model.”来输出内容,在Razor模板中是一样的,只是不用@model Models.Articles 来接收了,其它的语法跟在.cshtml试图页中是一样的,这么说多余了,因为写法不一样他就不是Razor了

三、我们写一个方法来获取模板页的Html代码

 /// 
 /// 获取页面的Html代码
 /// 
 /// 模板页面路径
 /// 页面编码
 /// 
 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);
 }

 /// 
 /// 获取页面的编码
 /// 
 /// Html源码
 /// 
 public System.Text.Encoding GetEncoding(string html)
 {
  string pattern = @"(?i)\bcharset=(?[-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静态页

/// 
 /// 创建静态文件
 /// 
 /// Html代码
 /// 生成路径
 /// 
 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静态页

/// 
 /// 解析模板生成静态页
 /// 
 /// 模板地址
 /// 静态页地址
 /// 数据模型
 /// 
 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
 {
 /// 
 /// 文章ID
 /// 
 public int Id { get; set; }
 /// 
 /// 文章标题
 /// 
 public string Title { get; set; }
 /// 
 /// 文章内容
 /// 
 public string Content { get; set; }
 /// 
 /// 作者
 /// 
 public string Author { get; set; }
 /// 
 /// 发布时间
 /// 
 public DateTime CreateDate { get; set; }
 }
  public class Company
 {
 /// 
 /// 公司Id
 /// 
 public int Id { get; set; }
 /// 
 /// 公司名称
 /// 
 public string CompanyName { get; set; }
 /// 
 /// 公司电话
 /// 
 public string CompanyTel { get; set; }
 /// 
 /// 联系人
 /// 
 public string ContectUser { get; set; }
 /// 
 /// 创建时间
 /// 
 public DateTime CreateDate { get; set; }
 }
   public class Column
 {
 /// 
 /// 栏目ID
 /// 
 public int Id { get; set; }
 /// 
 /// 栏目名称
 /// 
 public string Title { get; set; }
 /// 
 /// 文章列表
 /// 

 public virtual ICollection Articles { get; set; }
 }
   public class TemplateView
 {
 /// 
 /// ID
 /// 
 public int Id { get; set; }
 /// 
 /// 标题
 /// 
 public string Title { get; set; }
 /// 
 /// 内容
 /// 
 public string Content { get; set; }
 /// 
 /// 作者
 /// 
 public string Author { get; set; }
 /// 
 /// 时间
 /// 
 public DateTime CreateDate { get; set; } 
 /// 
 /// 公司名称
 /// 
 public string CompanyName { get; set; }
 /// 
 /// 公司电话
 /// 
 public string CompanyTel { get; set; }
 /// 
 /// 联系人
 /// 
 public string ContectUser { get; set; }
 /// 
 /// 文章列表
 /// 
 public virtual ICollection Articles { get; set; }
 }

二、我们在Service下创建一个基础操作接口以及其实现类(里面的很多方法 比如:获取页面的Html代码、获取页面的编码以及创建静态文件等 是没有必要写在接口的 这个可以写到公用的类库里,因为这里就用到这么几个方法 所以我没有加公用类库 就直接写在这里面了)

/// 
 /// 基础操作接口
 /// 
 /// 
 public interface IRepository where T : class
 {
 /// 
 /// 解析模板生成静态页
 /// 
 /// 模板地址
 /// 静态页地址
 /// 数据模型
 /// 
 bool CreateStaticPage(string temppath, string path, T t); 

 /// 
 /// 获取页面的Html代码
 /// 
 /// 模板页面路径
 /// 页面编码
 /// 
 string GetHtml(string url, System.Text.Encoding encoding);

 /// 
 /// 获取页面的编码
 /// 
 /// Html源码
 /// 
 System.Text.Encoding GetEncoding(string html);

 /// 
 /// 创建静态文件
 /// 
 /// Html代码
 /// 生成路径
 /// 
 bool CreateFileHtmlByTemp(string result, string createpath);
 }
/// 
 /// 基础接口实现类
 /// 
 /// 
 public abstract class RepositoryBase : IRepository where T : class
 {
 /// 
 /// 解析模板生成静态页
 /// 
 /// 模板地址
 /// 静态页地址
 /// 数据模型
 /// 
 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;
  }
 }

 /// 
 /// 获取页面的Html代码
 /// 
 /// 模板页面路径
 /// 页面编码
 /// 
 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);
 }

 /// 
 /// 获取页面的编码
 /// 
 /// Html源码
 /// 
 public System.Text.Encoding GetEncoding(string html)
 {
  string pattern = @"(?i)\bcharset=(?[-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代码
 /// 生成路径
 /// 
 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;
 }
 }

三、我们分别创建 文章管理、公司管理、栏目管理的接口和实现类 并且他们都集成基础操作

 /// 
 /// 文章管理
 /// 
   public interface IArticleManage:IRepository
 {
 }
 public class ArticleManage:RepositoryBase,IArticleManage
 {
 }

  /// 
 /// 公司管理
 /// 
 public interface ICompanyManage:IRepository
 {
 }
  public class CompanyManage:RepositoryBase,ICompanyManage
 {
 }

  //栏目管理
 public interface IColumnManage:IRepository
 {
 }
  public class ColumnManage:RepositoryBase,IColumnManage
 {
 }

四、注入Xml



 Spring注入Service,容器指向本层层封装的接口
 
 
 
 
 
 

五、我们分别初始化一个文章类、一个公司类(没有管理数据表,它下面没有文章列表 栏目模型我就不初始化了,怎么输出列表 大家可以参考下 栏目模板)

public class HomeController : Controller
 {
 /// 
 /// 声明一下注入接口
 /// 
 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 = "这里是文章内容", 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();
 }
 
 }

六、这是测试的简单的文章模板、公司模板和栏目模板




 
 @Model.Title


 

@Model.Title

 

作者:@Model.Author - 发布时间:@Model.CreateDate

 

@Raw(Model.Content)





 


 

公司名称:@Model.CompanyName

 

公司电话:@Model.CompanyTel

 

联系人:@Model.ContectUser

 

创建时间:@Model.CreateDate





 


 

栏目标题: @Model.Title

 

 文章列表  

      @foreach(var item in @Model.Articles)   {   
  •       @item.Title    @item.Author    @item.CreateDate      
  •   }  
 

我们运行一下,大功告成~~~

        ASP.NET MVC中怎么利用RazorEngine生成静态页

怎么排序?怎么获取前几条?怎么格式化日期时间?怎么分页?

这可是Razor啊,这都不需要再多讲了吧,简单一说,如果你传入数据前没有事先排序或者获取前几条,这些操作要做模板里操作 那跟在.cshtml里基本是一样的

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

 
@if (@item.LinkUrl==null)
 {
 
    @foreach(var article in @item.COM_ARTICLE.Take(15).OrderByDescending(p=>p.UpDateDate)) {
  •      
    @article.Title
      
  • }  
 }  else  {  }
}

看完上述内容,你们对ASP.NET MVC中怎么利用RazorEngine生成静态页有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注创新互联行业资讯频道,感谢大家的支持。


名称栏目:ASP.NETMVC中怎么利用RazorEngine生成静态页-创新互联
标题链接:http://scyanting.com/article/ppchs.html

其他资讯