详解ASP.NET MVC 解析模板生成静态页(RazorEngine)(3)

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

/// <summary> /// 基础操作接口 /// </summary> /// <typeparam></typeparam> public interface IRepository<T> where T : class { /// <summary> /// 解析模板生成静态页 /// </summary> /// <param>模板地址</param> /// <param>静态页地址</param> /// <param>数据模型</param> /// <returns></returns> bool CreateStaticPage(string temppath, string path, T t); /// <summary> /// 获取页面的Html代码 /// </summary> /// <param>模板页面路径</param> /// <param>页面编码</param> /// <returns></returns> string GetHtml(string url, System.Text.Encoding encoding); /// <summary> /// 获取页面的编码 /// </summary> /// <param>Html源码</param> /// <returns></returns> System.Text.Encoding GetEncoding(string html); /// <summary> /// 创建静态文件 /// </summary> /// <param>Html代码</param> /// <param>生成路径</param> /// <returns></returns> bool CreateFileHtmlByTemp(string result, string createpath); } /// <summary> /// 基础接口实现类 /// </summary> /// <typeparam></typeparam> public abstract class RepositoryBase<T> : IRepository<T> where T : class { /// <summary> /// 解析模板生成静态页 /// </summary> /// <param>模板地址</param> /// <param>静态页地址</param> /// <param>数据模型</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>模板页面路径</param> /// <param>页面编码</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>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>Html代码</param> /// <param>生成路径</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; } }

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wdpfdp.html