文章回顾:
1: 秋色园QBlog技术原理解析:开篇:整体认识(一) --介绍整体文件夹和文件的作用
2: 秋色园QBlog技术原理解析:认识整站处理流程(二) --介绍秋色园业务处理流程
3: 秋色园QBlog技术原理解析:UrlRewrite之无后缀URL原理(三) --介绍如何实现无后缀URL
4: 秋色园QBlog技术原理解析:UrlRewrite之URL重定向体系(四) --介绍URL如何定位到处理程序
5: 秋色园QBlog技术原理解析:Module之页面基类设计(五) --介绍创建基类和自定义生命周期
6: 秋色园QBlog技术原理解析:Module之页面基类-生命周期流程(六) --介绍基类生命周期内部业务
7: 秋色园QBlog技术原理解析:Module之基类生命周期-页面加载(七) --介绍界面html加载原理

 
ps:秋色园QBlog下载地址:http://www.cyqdata.com/download/article-detail-427
上节,我们解析了页面html是如何被加载并显示的
本节,将接着解析秋色园QBlog中的html的内容是将如何填充。
温馨提示:
好多网友表示看不懂本节内容,主要是由于本系列上下节关联性比较大,最好是先了解上节内容,才能更好的阅读和理解本节内容。
另提示:
1:由于本节内容,已跨越到Web.dll的处理范围,因此,把标题修正了一下。
2:上节中,还有一个多语言翻译的没有解析,因此下节会先补充多语言翻译内容,同时增加对本节的示例演示内容。

 
 
一:普通的操作与填充
 
先看如下图:
在右上角,有一个带链接的用户名:cyqdata
 
正常加载html后,根据ID获取A链接节点,并进行内容填充时,所需要的代码大致为:
XmlDocument xDoc = new XmlDocument();
        try
        {
            xDoc.Load("xml文件路径");
            XmlNode xNode = xDoc.SelectSingleNode("xpath语法");
            if (xNode != null)
            {
                xNode.InnerText = "秋色园:cyqdata";//用户名填充
                if (xNode.Attributes["href"] == null)//用户名链接填充
                {
                    XmlAttribute attr = xDoc.CreateAttribute("href");
                    xNode.Attributes.Append(attr);
                }
                xNode.Attributes["href"].Value = "http://www.cyqdata.com/";
            }
        }
使劲想啊:
一个节点填充,需要写这么长的代码,开发起来那得是何等相当的吃力?
对于Xml操作赋值,还需要考虑使用:<![CDATA[带特殊字符的内容]]>,来解析复杂内容。

 
如果没有一个好的思路来简化这些代码,开发起来不仅吃力,写完后的代码叠起来都得好几本书那么厚。
写的痛苦,看的难受,接手维护的还得赶往富士康接着跳。
 
为解救世人的这些苦难,在好多个日日夜夜后,XmlHelper出世了,它的出现,将这种开发简化到难与想象的地步,大大节省了代码量及提高了开发速度。
 
二:XmlHelper,秋色园镇山之宝
 
上节示例中话说已完成了页面html的加载,接着将分到各ashx处理程序中实现内容填充。
 
且看XmlHelper 出手,填充上面那用户名:
 
方法一:public void Set(string id, SetType setType, params string[] values);
Document.Set("labUserName", SetType.A, "秋色园:cyqdata", "http://www.cyqdata.com/");
用此方法,就一行,够省了吧。
介绍:
此方法,仅用于对单个节点填充。而SetType带有很多html标签类型,可根据不同类型选择不同标签。
同时此方法也有几个重载,详细使用,请先看CYQ.Data API文档,后续再写教程文章,敬请关注。

 
当然了,很多时候,值并不是固定的,通常是从数据库读取的较多,为了更好的和CYQ.Data下的MAction系列更好的结合,使出更简洁的用法,终于推出另一个方法:
 
方法二:
public void LoadData(MDataRow row);
public void SetFor(string id, SetType setType, params string[] values);
看看:两个方法配合,如何节源节流,先上图:
 
上图,有用户的博客标题和博客简介,还有用户简介,这些都得读数据库,代码如何?
Document.LoadData(DomainUser);
            Document.SetFor(IDKey.labSpaceName, forAdmin ? SetType.InnerText : SetType.InnerXml);
            Document.SetFor(IDKey.labSpaceIntro, forAdmin ? SetType.InnerText : SetType.InnerXml);
            if (!forAdmin)
            {
                Document.SetFor(IDKey.labCustomCss);
            }
 
这是秋色园中使用的代码,用户前台和后台,加了点小分支。
说明:
SetFor是如何从DomainUser(即MDataRow)中取数据的呢?关键还是约定的ID。
如labSpaceName,默认会读MDataRow中SpaceName字段的值,通过约定,内部最后再调用Set方法实现。

从上面两个方法看出,最终,还是只针对一个节点进行填充。
 
实际上,页面内容,多数是一个列表循环填充出来的。
 
再上一个很传统的列表循环图:
 
如果按传统的思路开发,应该将产生以下形式的代码:
using (MAction action = new MAction(TableNames.Blog_Content))
        {
            MDataTable table = action.Select();//取得表
            XmlNode tableNode=Document.GetByID("tableID");//拿出table节点
            XmlNode child = tableNode.ChildNodes[0].Clone();//复制一份要循环的tr节点。
            tableNode.RemoveAll();//清除所有子节点
            foreach (MDataRow row in table)//循环行
            {
                XmlNode newTrNode = child.Clone();//复制行一份
               newTrNode.InnerText=row.Get<string>(Content.Title);
                //然后赋第二个值。。第三个值...此处省略27个了
               tableNode.AppendChild(newTrNode);//加载行
            }
        }
 
很勉强的挤出了以上一堆的代码,还是用上了CYQ.Data的MAction才能这么省。
要是用其它框架写代码,那代码不还得往下排着走,试试CYQ.Data,有杀错不放过。
不过,写多了,还是觉得很不可思议。
 
其循环时,处理属性节点较多时,一个循环,那个代码写起来就得上百行了。
你的天啊我的天,再写多几个循环,痛苦莫过于想跳楼还得排队买票再排队那个那个...
为了将世人解救的更彻底些,怀胎十日后终于又生下了一个方法...
 
方法三:
public void LoadData(MDataTable table);
public void SetForeach(string id, SetType setType, params object[] formatValues);
介绍:
看着熟悉吧:Set、SetFor、SetForeach,一看就是一个家族的。
少说多做,看下SetForeach如何简化:
using (MAction action = new MAction(CustomTable.ArticleView))
            {
                Document.LoadData(action.Select());
                Document.SetForeach("tableID", "<li><a href=\"" + Config.HttpHost + "/{0}/article-detail-{1}\" >{2}</a></li>", Users.UserName, Content.ID, Content.Title);
            }
 
看,看,看,知道有多省了吧。
 
不过情况往往是复杂的,在循环的过程中,多数情况需要二次处理?咋整?
这个在秋色园里当然会出现,比如分页控件的样式,就是一种情况。
 
为此,增加一个事件,Document_OnForeach(string text, object[] values, int row)
且看用法:
using (MAction action = new MAction(CustomTable.ArticleView))
            {
                Document.LoadData(action.Select());
                Document.OnForeach+=new XmlHelper.SetForeachEventHandler(Document_OnForeach);
                Document.SetForeach("tableID", "<li><a href=\"" + Config.HttpHost + "/{0}/article-detail-{1}\" >{2}</a></li>", Users.UserName, Content.ID, Content.Title);
            }
string  Document_OnForeach(string text, object[] values, int row)
        {
          //text就是被循环的标签内容
            //values就是row的值
            //row就是循环到第几行了
            //最后,爱咋处理就咋处理,反正最后 return text;
        }

 
总结
基于秋色园这种(MVQ[简称MV秋模式])框架开发的,没有一套杀手锏,那是不成的,那得累死多少壮汗?老板得出多少血?周期得拖多少月?
因此,最好的莫过于借助:Set、SetFor、SetForeach小三口之助,才能开发起来如虎添翼、如梦如幻,如获至宝啊,超高的性价比,超常的理念,试一试,用一用,快乐无比、心花怒放,心血来潮啊。
一切尽在:CYQ.Data (视频)教程地址:http://www.cyqdata.com/cyqdata
CYQ.Data 赞助热线:http://www.cyqdata.com/cyqdata/article-detail-28641

下节:将为你解析秋色园QBlog是Post事件原理,同时会出产XmlHelper相关使用教程,敬请关注。
     本文转自cyq1162 51CTO博客,原文链接:http://blog.51cto.com/cyq1162/504243,如需转载请自行联系原作者

秋色园QBlog技术原理解析:Web之页面处理-内容填充(八)相关推荐

  1. 秋色园QBlog技术原理解析:性能优化篇:用户和文章计数器方案(十七)

    2019独角兽企业重金招聘Python工程师标准>>> 上节概要: 上节 秋色园QBlog技术原理解析:性能优化篇:access的并发极限及分库分散并发方案(十六)  中, 介绍了 ...

  2. 秋色园QBlog技术原理解析:性能优化篇:数据库文章表分表及分库减压方案(十五)...

    文章回顾: 1: 秋色园QBlog技术原理解析:开篇:整体认识(一) --介绍整体文件夹和文件的作用 2: 秋色园QBlog技术原理解析:认识整站处理流程(二) --介绍秋色园业务处理流程 3: 秋色 ...

  3. 秋色园QBlog技术原理解析:UrlRewrite之无后缀URL原理(三)

    文章回顾: 1: 秋色园QBlog技术原理解析:开篇:整体认识(一) --介绍整体文件夹和文件的作用 2: 秋色园QBlog技术原理解析:认识整站处理流程(二) --介绍秋色园业务处理流程 本节,将从 ...

  4. 秋色园QBlog技术原理解析:性能优化篇:打印页面SQL,全局的SQL语句优化(十三)...

    文章回顾: 1: 秋色园QBlog技术原理解析:开篇:整体认识(一) --介绍整体文件夹和文件的作用 2: 秋色园QBlog技术原理解析:认识整站处理流程(二) --介绍秋色园业务处理流程 3: 秋色 ...

  5. 秋色园QBlog技术原理解析:系列终结篇:最后的AOP策略(十九)

    2019独角兽企业重金招聘Python工程师标准>>> 开篇闲话: 好几个月没写文章了,从9月15号发布新浪"微博粉丝精灵"V1.0后,持续的几个月都在折腾它,现 ...

  6. 秋色园QBlog技术原理解析:性能优化篇:access的并发极限及超级分库分散并发方案(十六)...

    上节回顾: 上节 秋色园QBlog技术原理解析:性能优化篇:数据库文章表分表及分库减压方案(十五) 中, 介绍了 秋色园QBlog 在性能优化方面,从技术的优化手段,开始步入数据库设计优化,并从数据的 ...

  7. 秋色园QBlog技术原理解析:UrlRewrite之URL重定向体系(四)

    2019独角兽企业重金招聘Python工程师标准>>> 文章回顾: 1: 秋色园QBlog技术原理解析:开篇:整体认识(一) --介绍整体文件夹和文件的作用 2: 秋色园QBlog技 ...

  8. 秋色园QBlog技术原理解析:开篇:整体认识(一)

    2019独角兽企业重金招聘Python工程师标准>>> 很多网友表示对 秋色园 的实现原理感兴趣,有很多人,问了很多问题,包括: 1:URL地址怎么没有后缀? 2:多语言是怎么实现的 ...

  9. 秋色园QBlog高性能博客开放源码下载 限量下载1000次

    写在开源前的几句话: 1:本次开放的源码为V1.0 版本源码,限量下载,次数为1000次.   PS:目前下载量已近1000次,准备停止对外下载了,如果你是第1000次以外的下载者,想获取源码,你可以 ...

最新文章

  1. hdu3665 水最短路
  2. 【转载】企业级服务器设计与实现经验之插件系统基础篇
  3. Crontab和sudo中无法使用TensorFlow ImportError libcublas.so.9.0
  4. Hibernate 持久化状态、HQL语句大全(转)
  5. VS2012和XE2013的关联和设置问题
  6. android编辑框最大字数,TextView 限制最大行数、最小行数、字数超过“...”表示...
  7. asp打开exe执行本地程序._ASP.NET Core json配置文件
  8. java----JUnit
  9. 波士顿房价数据集——回归分析
  10. php手机网页在线录音ios,HTML5网页录音和上传到服务器,支持PC、Android,支持IOS微信...
  11. android6.0 power按键深入分析
  12. 彻底解决unable to find valid certification path to requested target
  13. 厦门情侣必去浪漫的餐厅
  14. ios15.0.1正式版耗电吗 ios15.0.1正式版值得升级吗
  15. 做过SEO优化的网站与普通站的区别在哪里
  16. 跟鸿蒙林雷组件轮回者势力,遮天的势力分划
  17. 如何查看Linux系统安装的时间?
  18. 股市买入卖出时间点选择问题
  19. LECTROETCH FORMULA LNC-3 0.93L
  20. [附源码]计算机毕业设计springboot农产品销售网站

热门文章

  1. solrlucene3.6.0源码解析(三)
  2. showModalDialog 页面上GridView的分页问题
  3. jvm第7节-锁(偏向锁,轻量锁,自旋锁)
  4. ABP Zero示例项目问题总结
  5. [LeetCode]题解(python):153-Find Minimum in Rotated Sorted Array
  6. 底板芯片组与内存映射(Motherboard Chipsets and the Memory Map) 【转】
  7. EJB究竟是什么,真的那么神奇吗??
  8. ruby on rails 之 延时执行代码
  9. Go语言学习笔记 - PART11 - 面向对象
  10. AntD Checkbox 的三种状态处理