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

简介:

文章回顾:

 

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/");

用此方法,就一行,够省了吧。[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);

 

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

 

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

复制代码
            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.DataMAction才能这么省。

要是用其它框架写代码,那代码不还得往下排着走,试试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相关使用教程,敬请关注。

 

版权声明:本文原创发表于博客园,作者为路过秋天,原文链接:

http://www.cnblogs.com/cyq1162/archive/2011/03/02/1968735.html

相关文章
|
16天前
|
前端开发 JavaScript 关系型数据库
从前端到后端:构建现代化Web应用的技术探索
在当今互联网时代,Web应用的开发已成为了各行各业不可或缺的一部分。从前端到后端,这篇文章将带你深入探索如何构建现代化的Web应用。我们将介绍多种技术,包括前端开发、后端开发以及各种编程语言(如Java、Python、C、PHP、Go)和数据库,帮助你了解如何利用这些技术构建出高效、安全和可扩展的Web应用。
|
22天前
|
自然语言处理 Java 数据库连接
掌握JSP页面编程:动态生成Web内容
【4月更文挑战第3天】Java Server Pages (JSP) 是一种用于创建动态Web内容的Java技术,它结合HTML并允许在页面中嵌入Java代码。JSP支持代码片段、表达式语言(EL)和JSTL标签库,简化动态内容生成。当服务器接收到请求时,执行JSP中的Java代码并将结果嵌入HTML返回给客户端。示例展示了如何显示当前日期和时间。JSP可与Servlet、JavaBeans、数据库等结合,用于构建功能丰富的交互式Web应用。
掌握JSP页面编程:动态生成Web内容
|
1月前
|
机器学习/深度学习 人工智能 前端开发
机器学习PAI常见问题之web ui 项目启动后页面打不开如何解决
PAI(平台为智能,Platform for Artificial Intelligence)是阿里云提供的一个全面的人工智能开发平台,旨在为开发者提供机器学习、深度学习等人工智能技术的模型训练、优化和部署服务。以下是PAI平台使用中的一些常见问题及其答案汇总,帮助用户解决在使用过程中遇到的问题。
|
1月前
|
前端开发 数据库 UED
构建高性能Web应用的关键技术
本文将介绍构建高性能Web应用的关键技术,包括前端优化、后端优化、数据库优化等方面。通过深入讨论各项技术的原理和实践方法,帮助开发者们提升Web应用的响应速度和用户体验。
|
1月前
|
存储 前端开发 JavaScript
从前端到后端,探索现代Web开发技术
本文探索了现代Web开发技术的各个方面,包括前端和后端开发以及多种编程语言的应用。通过对JavaScript、Java、Python、C、PHP和Go等语言的介绍,深入探讨了前端和后端开发的基本原理和常用工具。同时,还涵盖了数据库技术在Web开发中的重要性和应用场景。无论你是初学者还是有经验的开发者,本文都能为你提供全面的视角和实用的知识,帮助你在Web开发领域取得更好的成果。
|
1天前
|
设计模式 存储 前端开发
Java从入门到精通:2.2.1学习Java Web开发,了解Servlet和JSP技术,掌握MVC设计模式
Java从入门到精通:2.2.1学习Java Web开发,了解Servlet和JSP技术,掌握MVC设计模式
|
1月前
|
运维 Linux Apache
LAMP架构调优(十)——Apache禁止指定目录PHP解析与错误页面优化
LAMP架构调优(十)——Apache禁止指定目录PHP解析与错误页面优化
199 2
|
1月前
|
前端开发 开发者 UED
构建响应式Web界面:Flexbox与Grid布局的深度解析
【2月更文挑战第28天】 在现代前端开发中,打造灵活且适应不同屏幕尺寸的用户界面是至关重要的。随着移动设备的普及,响应式设计已经成为网页制作不可或缺的一部分。本文将深入探讨两种强大的CSS布局模块——Flexbox和Grid,它们如何简化布局创建过程,并赋予设计师更大的灵活性去构建动态和流畅的响应式界面。通过对这两种技术的比较、使用场景分析以及代码示例,读者将能够更好地理解何时以及如何使用这些工具来提升前端项目的质量和效率。
16 0
|
1月前
|
物联网 调度 开发者
构建高效Python Web应用:异步编程与Tornado框架解析
【2月更文挑战第27天】 在处理高并发的Web应用场景时,传统的同步阻塞模型往往难以满足性能需求。本文将深入探讨Python世界中的异步编程概念,并结合Tornado这一轻量级、非阻塞式Web服务器及框架,展示如何构建高性能的Web应用。通过实例驱动的方法论,我们将剖析Tornado的核心组件,包括其IOLoop、异步HTTP客户端和服务器端处理机制,以及与协程集成的细节。文章旨在为开发者提供一套实践指南,帮助他们利用Python实现快速响应和资源高效的Web服务。
29 2
|
1月前
|
开发框架 Dart 前端开发
构建响应式Web界面:Flutter的跨界前端技术
【2月更文挑战第23天】随着移动互联网的飞速发展,响应式Web设计成为现代前端开发的重要趋势。在众多框架中,Google推出的Flutter以其高效的渲染性能、跨平台能力及丰富的组件生态,为前端开发者带来了新的选择。本文将深入探讨如何利用Flutter进行高效、美观的响应式界面构建,同时剖析其与传统前端技术的差异和优势。

推荐镜像

更多