首页 > 其他分享 >秋色园QBlog技术原理解析:Web之页面处理-内容填充(八)

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

时间:2022-09-29 23:01:19浏览次数:90  
标签:Web 解析 填充 秋色 QBlog Document SetType

文章回顾:

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:上节中,还有一个多语言翻译的没有解析,因此下节会先补充多语言翻译内容,同时增加对本节的示例演示内容。

 

一:普通的操作与填充

 

先看如下图:

秋色园QBlog技术原理解析:Web之页面处理-内容填充(八)_加载

在右上角,有一个带链接的用户名:​​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/​​");

用此方法,就一行,够省了吧。[Document是什么?其实就是XmlHelper定义的对象,在上节的示例中,在基类里定义成属性,因此各ashx中可以直接拿到]

介绍:

此方法,仅用于对单个节点填充。而SetType带有很多html标签类型,可根据不同类型选择不同标签。

同时此方法也有几个重载,详细使用,请先看​​CYQ.Data API文档​​,后续再写教程文章,敬请关注。

 

当然了,很多时候,值并不是固定的,通常是从数据库读取的较多,为了更好的和​CYQ.Data​​下的​​MAction​​系列更好的结合,使出更简洁的用法,终于推出另一个方法:

 

方法二:

public void LoadData(MDataRow row);

public void SetFor(string id, SetType setType, params string[] values);

 

看看:两个方法配合,如何节源节流,先上图:

秋色园QBlog技术原理解析:Web之页面处理-内容填充(八)_加载_02

 

上图,有用户的博客标题和​博客​简介,还有用户简介,这些都得读数据库,代码如何?

            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方法实现。

从上面两个方法看出,最终,还是只针对一个节点进行填充。

 

实际上,页面内容,多数是一个列表循环填充出来的。

 

再上一个很传统的列表循环图:

秋色园QBlog技术原理解析:Web之页面处理-内容填充(八)_加载_03

 

如果按传统的思路开发,应该将产生以下形式的代码:

      

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小三口之助,才能开发起来如虎添翼、如梦如幻,如获至宝啊,超高的性价比,超常的理念,试一试,用一用,快乐无比、心花怒放,心血来潮啊。


 

下节:将为你解析秋色园QBlog是Post事件原理,同时会出产XmlHelper相关使用教程,敬请关注。

 

标签:Web,解析,填充,秋色,QBlog,Document,SetType
From: https://blog.51cto.com/cyq1162/5724379

相关文章

  • 秋色园QBlog技术原理解析:Module之页面基类-生命周期流程(六)
    文章回顾:1:​​秋色园QBlog技术原理解析:开篇:整体认识(一)​​--介绍整体文件夹和文件的作用2:​​秋色园QBlog技术原理解析:认识整站处理流程(二)​​--介绍秋色园业务处理......
  • 秋色园QBlog技术原理解析:Module之基类生命周期-页面加载(七)
    文章回顾:1:​​秋色园QBlog技术原理解析:开篇:整体认识(一)​​--介绍整体文件夹和文件的作用2:​​秋色园QBlog技术原理解析:认识整站处理流程(二)​​--介绍秋色园业务处理......
  • 前端面试总结12-WebApi-存储
    简述cooki,localstorage,sessionstorage的区别(1:cookie数据存放在浏览器上,session存放在服务器上(2:cookie安全性低(3:session占用服务器性能(4:单个cookie最大存储数据不超过4k......
  • 支付宝沙箱服务 (结合springboot实现,这里对接的是easy版本,工具用的是IDEA,WebStrom)
    一:打开支付宝开发平台,登录,然后点击控制台https://open.alipay.com/   二:滚动到底部,选着沙箱服务   三:获取到对接要用的appId和公钥私钥    四......
  • Ajax、反向Ajax和WebSocket 概念
    Ajax异步的JavaScript和XML(AsynchronousJavaScriptandXML,Ajax),一种可通过JavaScript来访问的浏览器功能特性,其允许脚本向幕后的网站发送一个HTTP请求而又无需重新加载......
  • 前端面试总结11-WebApi-Ajax
    1.同源策略:ajax请求时,浏览器要求当前网页和serve必须同源(安全),即协议,域名,端口三者必须一致2.可无视同源策略的情况(1:<img/>可用于统计打点,可使用第三方统计服务(2:<link/><......
  • PythonWeb开发
    1.什么是Flask?有什么优点?2.Django和Flask有什么区别?3.Flask-WTF是什么,有什么特点?4.Flask脚本的常用方式是什么?5.如何在Flask中访问会话?6.解释PythonFlask中的数据......
  • 客户端数据存储之 Web Storage
    WebStorageWebStorage有两种形式:localStorage(本地存储)和sessionStorage(会话存储)。与cookie相似,都是使用键值对来对数据进行存储和读取。这里对cookie与Web......
  • 大华海康NVR录像JAVA下载及WEB播放
    近期在处理一个将NVR录像机上的录像下载到服务器并通过浏览器播放的需求。梳理记录下过程,做个备忘,同时遇到的一些细节问题解决,也供需要的同学参考。需求比较简单......
  • webapi 问题收集
    webapi问题收集1请确保在所有其他初始化代码后面的应用程序启动代码中调用HttpConfiguration.EnsureInitialized()当启动webapi项目调用其中一个url时报该错误,解决方法如......