CMS模板引擎:XHtmlAction

简介:

前言:

先说说大伙关心的工作上的事,在上家公司任了一个多月的技术经理后,和公司中止了合作关系。

主要原因在于一开始的待遇没谈的太清楚:

1:没有合同,没有公积金,连社保也没交。

2:工资的30%变成了绩效(对我还实行特例,按季度或按项目发,而且绩效只有按期完成(发)与没完成(不发))

3:税后的问题,要自己去弄发票来填。

只能说缘来的太快,份走的也太快。


对于工作上的事,一个多月的时间,从需求文档到概要文档到详细文档,到产品原型到系统架构,基本上已经走完了。

项目成员也招聘完成,开发的按我的计划稳定的进行着,所有的技术难点,我都提前解决了。

虽然人走,但后续剩下点的任务也安排好了,剩下的开发有种没了我依然一切如旧的悲凉感觉。


交待完前事,下面进入技术正题。

1:ASP.NET的模板引擎(也称视图引擎):ASPX和Razor 简单介绍

如图有两种视图引擎:

26135147-46bed169a7f64540bdbb6899b410993


微软视图引擎的基本原理:

加载模板(aspx、cshtml)-》调用引擎解析成(语法树)-》生成CS代码-》动态编绎-》返回最终模板。

26140333-d450ab7e9f4d481c8db9b82ab3d0d68

相对来说,这种模板引擎,性能相对来说会下降一些,但是搭载VS IED的智能提示,和大伙多年的开发习惯,已经占据了主流。


对于Razor有兴趣研究的,想深入的可以下载源码去慢慢慢慢研究,Razor 的源码(取自mvc5源码的razor项目):点击下载

这里也有篇Razor的原理基础文章,可供参考: http://www.cnblogs.com/JamesLi2015/p/3213642.html

源码目录截图:

26142340-3841578562e44d9f8e34f4d9064a429

2:CYQ.Data 模板引擎:XHtmlAction:

XHtmlAction模板引擎的基本原理:

26143058-1d58e3902a11484392c1d5df49c857c

和ASP.NET自带的模板引擎比较,这里没有语法树、生成代码和动态编绎过程,因此可以得到高性能的体验。

另外相对来说,对Xml及XPath语法的操作进行了封装,简化了很多后台开发代码。

当然相对缺点就是不能在模板里混合写后台代码了,换个说法是没有强大的IDE智能提示(若换个角度看,也成优点,模板和后台代码真正分离了)。

XHtmlAction实现也相当的轻量级,一共就6个文件,老少皆宜,有兴趣研究的可以看 CYQ.Data V4.55的源码:

26143711-ba1f06f38ea6473381160a704ef7cec

曾经也写过两篇相关的文章:

1:多语言的(MutilLanguage),可以让你很轻松的编写多语言网站:实战篇-简单多语言的实现

2:XHmlAction的使用(以前类名叫XmlHelper,用法是一样的):CYQ.Data.Xml XmlHelper 助你更方便快捷的操作Xml/Html


除了介绍的(XmlHelper)用法,最近V5版本增加了“CMS标签替换”功能,下面介绍。


3:XHtmlAction CMS标签替换功能介绍:

3.1 这里用CYQ.Data的文本数据库来演示:

先写个函数,创建文本数据库和添加数据:

// 创建文件数据库,并添加50条数据。
void TxtDBCreate()
   {
       MDataTable.CreateSchema( " demo.txt "falsenew string[] {  " Name "" CreateTime " },  new SqlDbType[] { SqlDbType.NVarChar, SqlDbType.DateTime });
using (MAction action =  new MAction( " demo "))
       {
for ( int i =  0; i <  50; i++)
           {
               action.Set( " Name "" Name_ " + i.ToString());
               action.Set( " CreateTime ", DateTime.Now.AddSeconds(i));
               action.Insert();
           }
       }
   }

该代码执行后,生成两个文件:demo.ts(表结构)demo.txt(json格式的表数据)

26150110-816fe121057e4213bdecbdc8cf55a3d

文本里的Json数据:

26150326-c7bd35225491453daaff34e1e29df16

文本数据库相当于创建好了,配置里添加一行数据库链接请求:

< connectionStrings >
< add  name ="Conn"  connectionString ="txt path={0}" />
</ connectionStrings >

3.2 项目示例代码:

弄好数据库,可以写代码了,单条数据的标签替换:

protected void Page_Load( object sender, EventArgs e)
   {

using (XHtmlAction xml =  new XHtmlAction( true))
       {
           xml.Load(Server.MapPath( " demo.html ")); // 加载html模板。
using (MAction action =  new MAction( " demo "))  // 数据库操作,操作demo表。
           {
if (action.Fill( 1)) // 查询id=1的数据
               {
                   xml.LoadData(action.Data,  " txt ");//将查询的数据行赋给XHtmlAction,并指定CMS前缀
               }
// xml.LoadData(action.Select());
// xml.SetForeach("divFor", SetType.InnerXml);
           }
           Response.Write(xml.OutXml); // 输出模板
       }
   }

代码解答:

代码的关键就在于方法:LoadData(MDataRow,autoSetValuePre)
只要把数据行赋给模板,加一个任意前缀,之后就可以在html中任意使用:{$txt#Name} 或{$txt-CreateTime}或{$txt#ID}来代表数据的值。
'#','-'是默认的前缀分隔符号,任意使用其一都可。
{$字段名} 这个是因为大多数的模板引擎都采用这种,故采用这种通用方式。
上面的代码中,有两行是注释的,是多行数据的(表循环),方法是:LoadData(MDataTable);

如果把上面的代码注释放开,Html如下:

<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
< html  xmlns ="http://www.w3.org/1999/xhtml" >
< head >
< title >{$txt#Name} </ title >
</ head >
< body >
< div  title ="单条数据" >
单条数据:{$txt#Name} - {$txt-CreateTime}
</ div >
< hr  />
< div  id ="divFor"  title ="多条数据" >
{$Name} - {$CreateTime} < br  />
</ div >
</ body ></html>

最终效果输出如下图:

26152903-d4a245153c9a4ec285d08803d736a71


本Demo源码下载: 点击下载

4:XHtmlAction 关键点

1:字段前缀:

对于一个html,可能涉及到相同的字段名(同表的不同行数据,不同表的数据)需要标签替换,因此LoadData(数据行,前缀)方法需要前缀来区分。

同时前缀也可以传空"",不使用前缀(但要注释避免和其它的冲突)。

对于行的数据,是在获取xml.OutXml属性的时候才处理,因为对于标签,可以存在任意地方,因此不能以节点来处理,只能在最终输的时候,拿到html,再用正则替换。


2:表格输出:

对于表格的输出,需要获取某个节点,以对节点下的内容,进行克隆复制循环输出,由于已经存在节点,所以在xml.SetForeach的时候就处理了。

如果涉及到字段格式化,仍按SetForeach的事件处理即可。


3:示例说明:

本文及示例介绍的是标签替换的功能,节点替换的操作方式,仍和以前的操作方式一致。


总结:

对于Web开发框架,主打关键就三块:URL重写(路由)、模板引擎(视图引擎)、数据层框架(ORM)。

如果你能掌控或自由实现这三模块,你的开发方式选择就自由化很多,如果不能,你只能局域于微软给你的WebForm和MVC。

对于框架,有时候研究的再深,也不如自己写一个浅的。






     本文转自cyq1162 51CTO博客,原文链接:http://blog.51cto.com/cyq1162/1332006,如需转载请自行联系原作者






相关文章
|
10天前
|
存储 监控 搜索推荐
内容管理系统CMS是什么?全面解读CMS的核心功能
2分钟了解内容管理系统CMS的主要作用和常见平台。CMS常被用于简化内容管理流程,提高内容发布效率。
86 7
内容管理系统CMS是什么?全面解读CMS的核心功能
|
3月前
|
安全 前端开发 UED
除了wordpress CMS外,还有什么CMS值得我们使用?
作为建站的小白,前端不会开发、后台不会编写,用CMS来搭建网站是最理想的建站方式,经过线上的站长推荐,我认识了wordpress CMS,来自国外的一套CMS,使用上非常方便,熟悉时间不需要太长,也能快速进入建站的过程。
|
2月前
|
自然语言处理 安全 前端开发
什么是CMS?CMS适合搭建什么网站?
CMS(内容管理系统)用于快速搭建、管理和发布网站内容。它支持自定义板块,降低建站门槛。CMS分为独立CMS和SaaS CMS两种类型,主要功能包括角色分配、SEO优化、多语言支持等。建站流程包括确定需求、选择系统、购买域名和主机、安装系统、选择模板、扩展栏目、添加内容、上线和维护。PageAdmin CMS是一款优秀的建站系统,推荐免费试用。
169 1
|
3月前
|
域名解析 前端开发 搜索推荐
什么叫CMS?如何使用CMS来制作网站?
PageAdmin CMS,是一套开发了17年,官网还持续在更新和维护的网站内容管理系统,对于领开发的用户来说,对于有网站优化的用户来说,PageAdmin CMS就能帮助我们快速搭建属于自己的个性网站或企业网站。
241 5
|
4月前
|
Web App开发 PHP iOS开发
易优CMS PHP原生标签调用
这段代码实现了一个自动化工具,用于从指定的漫画网站下载章节内容,并将其转换为PDF格式。它首先通过用户输入的链接获取网页信息,然后根据用户的选择下载整个章节或特定章节的图片,并保存到本地文件夹中。下载完成后,工具会将这些图片合并成一个PDF文件,并添加书签以便于浏览。此外,代码还包含了异常处理机制,确保在网络不稳定时能够重试下载。
44 4
|
SQL 前端开发 JavaScript
基于模板引擎的博客系统 (Servlet)(下)
基于模板引擎的博客系统 (Servlet)(下)
146 0
基于模板引擎的博客系统 (Servlet)(下)
|
存储 SQL Web App开发
基于模板引擎的博客系统 (Servlet)(上)
基于模板引擎的博客系统 (Servlet)(上)
178 0
基于模板引擎的博客系统 (Servlet)(上)
ThinkPHP6.0使用twig作为模板引擎及自定义过滤器
ThinkPHP6.0使用twig作为模板引擎及自定义过滤器
212 0
|
缓存 应用服务中间件 PHP
使用 Swoole 加速你的 CMS 系统,并实现热更新 (基于 Laravel 框架)
使用 Swoole 加速你的 CMS 系统,并实现热更新 (基于 Laravel 框架)
215 0
使用 Swoole 加速你的 CMS 系统,并实现热更新 (基于 Laravel 框架)
|
缓存 NoSQL 程序员
极简实用的Asp.NetCore模块化框架新增CMS模块
Asp.NetCore模块化框架新增CMS模块
178 0
极简实用的Asp.NetCore模块化框架新增CMS模块