<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_黑曜石</title><subtitle type="text">从网上来，到网上去</subtitle><id>http://feed.cnblogs.com/blog/u/53987/rss</id><updated>2012-02-04T01:59:40Z</updated><author><name>黑曜石</name><uri>http://www.cnblogs.com/bestfc/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bestfc/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/53987/rss"/><entry><id>http://www.cnblogs.com/bestfc/archive/2012/02/04/2337756.html</id><title type="text">一句话评论设计模式六大原则【转】</title><summary type="text">注：转自http://blog.csdn.net/jesse621/article/details/7216331原则，故名思议则是本质的意思。所谓擒贼先擒王，研究设计模式自然要先了解设计原则，所有的模式都是在这些原则的基础之上发展起来的，有的是侧重一个，有的是多个都有所涉及。看完设计模式之后，我感觉到每个模式都有这些原则的影子，还渗透着面向对象的三大属性，也觉得这些原则也都有相通之处，，正是有了他们才使我们由代码工人转为艺术家。下面我来点评一下六大原则，望各位拍砖：1、单一职责原则（Single Responsibility Principle，简称SRP） 单一职责原则，就一个类而言，..</summary><published>2012-02-04T01:58:00Z</published><updated>2012-02-04T01:58:00Z</updated><author><name>黑曜石</name><uri>http://www.cnblogs.com/bestfc/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bestfc/archive/2012/02/04/2337756.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bestfc/archive/2012/02/04/2337756.html"/><content type="html">&lt;p&gt;注：转自&lt;a href="http://blog.csdn.net/jesse621/article/details/7216331"&gt;http://blog.csdn.net/jesse621/article/details/7216331&lt;/a&gt;&lt;/p&gt;&lt;p&gt;原则，故名思议则是本质的意思。所谓擒贼先擒王，研究设计模式自然要先了解设计原则，所有的模式都是在这些原则的基础之上发展起来的，有的是侧重一个，有的是多个都有所涉及。看完设计模式之后，我感觉到每个模式都有这些原则的影子，还渗透着面向对象的三大属性，也觉得这些原则也都有相通之处，，正是有了他们才使我们由代码工人转为艺术家。下面我来点评一下六大原则，望各位拍砖：&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 18px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 18px;"&gt;&lt;strong&gt;1、单一职责原则（Single Responsibility Principle，简称SRP）&lt;/strong&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 单一职责原则，就一个类而言，应该仅有一个引起它变化的原因。如果一个类承担的职责过多，就等于把这些职责耦合在一起，一个职责的变化可能会消弱或者一直这个类完成其他职责的能力。这种耦合会导致脆弱的设计，当变化发生时，设计会遭受到意想不到的破坏。而软件设计真正要做的许多内容，就是发现职责，并把这些职责相互分离。&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 18px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 一句话点评：高内聚低耦合的绝佳体现，不要乱拉关系，独善其身挺好。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 18px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 18px;"&gt;&lt;strong&gt;2、 开放--封闭原则（The Open-Closed Principle,简称OCP）&lt;/strong&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;开放--封闭原则，是说软件实体（类、模块、函数等等）应该可以扩展，但是不可以修改。即对于扩展是开放的，对于更改是封闭的。 我们不可能做到未卜先知，在设计的时候尽可能让一个类足够好，设计好了就不要去修改了；不能完全封闭的情况下，当发生变化时，我们就创建抽象来隔离以后发生的同类变化。&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 18px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 一句话点评：开放扩展，封闭更改，开合有度是一门艺术。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 18px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 18px;"&gt;&lt;strong&gt;3、依赖倒转原则（Dependence Inversion Principle ）&lt;/strong&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 依赖倒转原则，指高层模块不应该依赖低层模块，两个都应该依赖抽象；抽象不应该依赖细节，细节应该依赖抽象。说白了就是要针对接口编程，不要对实现编程。举个例子：计算机硬件中，如果内存坏了，那么只需要换一个内存条就可以了，而不需要去换一个主板，在这里内存是一个接口类，只要符合他的规格要求就行，无论是那一根。&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 18px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;一句话点评：搞建筑时要做设计师，而不是砖瓦工，抽象的蓝图要靠具体的材料一点点实现。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 18px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 18px;"&gt;&lt;strong&gt;4、里氏代换原则（Liskov Substitution Principle，简称LSP）&lt;/strong&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;里氏代换原则，子类型必须能够替换掉他们的父类型。在软件里面，把父类都替换成其子类，程序的行为不会发生变化。正是由于子类型的可替换性才使得使用父类型的模块在无需修改的情况下就可以扩展。&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 18px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;一句话点评：长辈给了你继承的权利就一定要做赡养的义务，把长辈的职责都要承担起来。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 18px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 18px;"&gt;&lt;strong&gt;5、迪米特法则（&lt;span style="line-height: 24px; font-family: arial, 宋体, sans-serif; font-size: 15px;"&gt;Law of Demeter&lt;/span&gt;）&lt;/strong&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="font-size: 18px;"&gt;迪米特法则，&lt;/span&gt;如果两个类不必彼此直接通信，那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法时，可以通过第三者转发这个调用。类之间的耦合越弱，就越有利于复用，一个处在弱耦合的类被修改，不会对有关系的类造成波及。 主要是强调了类之间的松耦合。&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 18px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;一句话点评：不要和陌生人说话，若两国交战要尽量避免正面冲突，多派使者协商调度。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 18px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 18px;"&gt;&lt;strong&gt;6、合成/聚合复用原则（Composition/Aggregation Principle]，简称CARP）&lt;/strong&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;合成聚合复用原则，尽量使用合成/聚合，尽量不使用类继承。合成聚合是&amp;ldquo;has &amp;nbsp;a&amp;rdquo;的关系，而继承是&amp;ldquo;is &amp;nbsp;a&amp;rdquo;的关系。由于继承是一中强耦合的结构，父类变，子类必变。所以不是&amp;ldquo;is&amp;nbsp; a&amp;rdquo;关系，我们一般不要用继承。优先使用合成聚合复用原则，有助于保持每个类的封装，降低继承的层次。&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;一句话点评：优生优育，不要盲目繁衍。&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/bestfc/aggbug/2337756.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/bestfc/archive/2012/02/04/2337756.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/bestfc/archive/2011/11/17/basket.html</id><title type="text">电子商务B2C网站购物车设计</title><summary type="text">宝宝这月8号的预产期，结果到今天都没出来，估计是怕冷不想出来。。。为了陪产，把工作给辞了，离职已一月有余，难得的一段时间。坚持天天看看博客园，就像公务员天天喝茶，是种习惯了，或许又是怕自己离开社会太久，没技术了到时候找不着工作~很久没有更新自己的博客，怕再不写点什么就要生杂草了。原来就职于戴维尼珠宝网，代码基本上是自己码出来的，用的MVC2.0+SPARK视图引擎。我发现SPARK中文方面的文章就只有我自己写的那篇，国外用的人挺多，看stackoverflow上问相关问题的就挺多，是个很优秀的视图引擎不过在VS2010没有智能提示是个不爽的地方，说实话，我当时写也是拿VS2010当记事本来用的</summary><published>2011-11-17T03:16:00Z</published><updated>2011-11-17T03:16:00Z</updated><author><name>黑曜石</name><uri>http://www.cnblogs.com/bestfc/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bestfc/archive/2011/11/17/basket.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bestfc/archive/2011/11/17/basket.html"/><content type="html">&lt;p&gt;宝宝这月8号的预产期，结果到今天都没出来，估计是怕冷不想出来。。。&lt;br /&gt;为了陪产，把工作给辞了，离职已一月有余，难得的一段时间。&lt;br /&gt;坚持天天看看博客园，就像公务员天天喝茶，是种习惯了，或许又是怕自己离开社会太久，没技术了到时候找不着工作~&lt;br /&gt;很久没有更新自己的博客，怕再不写点什么就要生杂草了。&lt;br /&gt;原来就职于戴维尼珠宝网，代码基本上是自己码出来的，用的MVC2.0+SPARK视图引擎。&lt;br /&gt;我发现SPARK中文方面的文章就只有我自己写的那篇，国外用的人挺多，看stackoverflow上问相关问题的就挺多，是个很优秀的视图引擎&lt;br /&gt;不过在VS2010没有智能提示是个不爽的地方，说实话，我当时写也是拿VS2010当记事本来用的。。。&lt;/p&gt;&lt;p&gt;闲话不多说，在本文中我想说的是在电子商务中购物车的设计与实现&lt;br /&gt;购物车是网站的咽喉之地，订单是白花花的银子，所有银子都必然流经购物车，购物车不能有失。&lt;br /&gt;优秀的购物车设计至少需要完成两项使命：一是方便用户多买货多掏银子；二是帮用户保管好待购的货品，方便下次接着掏银子。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;一般来说，可以使用session,cookie和数据库来记录购物车数据&lt;br /&gt;1，不过不提倡使用session，这货占用服务器资源，还有过期时间，客户关掉浏览器时session即消失，下次再上来，又得重新选产品。&lt;br /&gt;2，cookie这东西不错，放在客户端的，给个一年的过期时间，只要客户不清掉，每次来都能记得上次的购物车信息。大家可以看看京东，&lt;br /&gt;在购物车cookie中存了不少东西，有产品编码和购买的数量等信息，如京东：yCartOrderLogic={&amp;amp;TheSkus&amp;amp;:[{&amp;amp;Id&amp;amp;:437741$&amp;amp;Num&amp;amp;:2}]}，&lt;br /&gt;原来凡客的cookie中也以JSON的形式存了很多信息。&lt;br /&gt;所以，我以学习的心态，将产品编码，价格，名称，类型和数量等购物信息做成一个对象，然后对象序列化成JSON，存在客户端的COOKIE中，&lt;br /&gt;在读取cookie时，在刚开始的时候很好用，反序列化cookie值成购物车条目对象就可以了，但是当产品类型多起来之后，而且有套装那种多件产品时，&lt;br /&gt;甚至产品不是来自同一个数据表时，比如普通首饰和钻石，表的结构都不一样了，还得到不同的表格中去取，当然首先你得判断产品类型&lt;br /&gt;这时候一个购物条目对象已经有多条子对象，往往一个查询中嵌套着两重以上的循环加上多个switch case，当购物车中有十个复杂的条目时，读取速度&lt;br /&gt;将超过十秒，不管怎么优化，速度就摆在那里，不快不慢。。。而且你不能保证客户不下100个或更多的复杂购物车记录，最重要的是cookie是有&lt;br /&gt;存储大小限制的，这种做法有产品很复杂时是不利的，果断放弃！&lt;br /&gt;3，数据库这东西好啊，不会像cookie那种容易丢失，也没有客户端的限制，你想怎么存，存多少都行。&lt;/p&gt;&lt;p&gt;购物车数据存数据库好处有很多，可以分析购买行为，可以为客户保存购买信息（不会因为浏览器关闭而丢失）等。&lt;br /&gt;还需要考虑的一个问题是用户是否登录，淘宝使用的就是cookie记录，你可以试试，未登录时可以加20个商品，登录后可以加50个，这就是因为&lt;br /&gt;cookie客户端的限制。&lt;br /&gt;我这里因为产品线的复杂性，所有购物车条目都保存在数据库中。&lt;/p&gt;&lt;p&gt;购物车数据库设计成两个关联表&lt;br /&gt;1，Basket，购物车主表&lt;br /&gt;基本字段有：BasketId,AddTime,UserId,AddressId,Payment,Status等，不解释了，看英文意思就行&lt;br /&gt;2，BasketDetail，购物车条目表&lt;br /&gt;基本字段有：BasketDetailId,BasketId,Type,Code,Qty,ParentId等，ParentId用作子行标识，其它不解释&lt;br /&gt;两个表之间使用BasketId做为关联&lt;br /&gt;当用户登录状态时，添加产品到购物时，查看Basket中是否有Status为True的购物车，没有则添加一条新的Basket记录，并将产品信息相关数据添加至BasketDetail表中&lt;br /&gt;当用户未登录时，使用cookie记录一个BasketId值，不往Basket表中插入数据，只往BasketDetail插入数据，其中的BasketId值使用cookie中的BasketId值，当用户登录&lt;br /&gt;后，查看Basket中是否有Status为True的购物车记录，有则合并（更新cookie和BasketDetail中的BasketId为查询出来的Basket表中的BasketId值），无则添加一条新的&lt;br /&gt;Basket记录，并将BasketId值置为Cookie中记录的basketid值&lt;/p&gt;&lt;p&gt;购物车C#对象也设计两个（主要用于获取数据）&lt;br /&gt;1，BasketModel，大体如下：&lt;br /&gt;public class BasketModel:Basket&lt;br /&gt;{&lt;br /&gt; public decimal TotalPrice{get;set;}&lt;br /&gt; public int TotalMP{get;set;}&lt;br /&gt; public List&amp;lt;BasketDetailModel&amp;gt; BasketDetailModels{get;set;}&lt;br /&gt;}&lt;br /&gt;2，BasketDetailModel，大体如下：（这里的ViewBasketDetail是一个视图，上面BasketDetail设计中没有产品价格，用视图关联到相关的表，获取价格，为什么不设计价格字段，不解释。。。）&lt;br /&gt;public class BasketDetailModel&lt;br /&gt;{&lt;br /&gt; public ViewBasketDetail Detail{get;set;}&lt;br /&gt; public List&amp;lt;ViewBasketDetail&amp;gt; SubDetails{get;set;}&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;至此，基本上购物车的设计就完成了，剩下的就是编码了&lt;br /&gt;个人觉得这样的设计还是比较健壮的，很好的完成了购物车的两项使命，大家如果有更好的设计可以拿出来分享一下&lt;/p&gt;&lt;p&gt;用以上设计思想，完成了以下两个网站的购物车设计&lt;br /&gt;www.520.cn （mvc2.0,spark,entity）&lt;br /&gt;www.tojik.cn （mvc3.0,razor,entity）&lt;br /&gt;最后说一句，还是razor好用啊，有智能提示！~&lt;/p&gt;&lt;img src="http://www.cnblogs.com/bestfc/aggbug/2252400.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/bestfc/archive/2011/11/17/basket.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/bestfc/archive/2011/06/28/MongoDB.html</id><title type="text">MongoDB搭建和简单操作（windows环境）</title><summary type="text">昨天看到fish的MongoDB，但遇到不少问题，于是自己一步一步尝试，将遇到之问题和解决方法记录总结首先感谢fish！昨天忘了放链接：http://www.cnblogs.com/fish-li/archive/2011/06/26/2090800.html再有就是快一年没更新博客了，不过本人天天打开博客园看各位的博文，就像公务员每天上班喝茶看报纸一样，习惯了。。。尽量以后每月出个两篇文章吧，本人这一年没写博客就干了一个活，www.520.cn，请大家赏析，前台使用mvc2.0，spark引擎，Entity Framework，当然还有jQuery这篇写完，这周再出个简单用C#操作Mongo</summary><published>2011-06-28T08:18:00Z</published><updated>2011-06-28T08:18:00Z</updated><author><name>黑曜石</name><uri>http://www.cnblogs.com/bestfc/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bestfc/archive/2011/06/28/MongoDB.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bestfc/archive/2011/06/28/MongoDB.html"/><content type="html">&lt;p&gt;昨天看到fish的MongoDB，但遇到不少问题，于是自己一步一步尝试，将遇到之问题和解决方法记录总结&lt;/p&gt;&lt;p&gt;首先感谢fish！昨天忘了放链接：&lt;a target="_blank" href="http://www.cnblogs.com/fish-li/archive/2011/06/26/2090800.html"&gt;http://www.cnblogs.com/fish-li/archive/2011/06/26/2090800.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;再有就是快一年没更新博客了，不过本人天天打开博客园看各位的博文，就像公务员每天上班喝茶看报纸一样，习惯了。。。&lt;/p&gt;&lt;p&gt;尽量以后每月出个两篇文章吧，本人这一年没写博客就干了一个活，&lt;a href="http://www.520.cn"&gt;www.520.cn&lt;/a&gt;，请大家赏析，前台使用mvc2.0，spark引擎，Entity Framework，当然还有jQuery&lt;/p&gt;&lt;p&gt;这篇写完，这周再出个简单用C#操作MongoDB的增删改查，Demo将会以MVC+SPARK的方式出现，哎，为什么没几个人用spark，这么好的东西，比什么razor好多了，只是没有智能提示而已~&lt;/p&gt;&lt;p&gt;您可以在这个地址下载到MongoDB: &lt;a href="http://www.mongodb.org/downloads"&gt;http://www.mongodb.org/downloads&lt;/a&gt;&lt;br /&gt;本人环境32位win7旗舰片，因此下载到mongodb-win32-i386-1.8.2&lt;br /&gt;在下载页的下方官方有提供各种开发语言的驱动，本人C#，直接移位&lt;a href="https://github.com/samus/mongodb-csharp"&gt;https://github.com/samus/mongodb-csharp&lt;/a&gt;下载即可&lt;br /&gt;一，安装mongoDB&lt;br /&gt;1，解压mongodb-win32-i386-1.8.2至E:\MyProgram\mongodb-win32-i386-1.8.2（你可以按照自己的路径来，路径中最好不要有空格，要不然麻烦）&lt;br /&gt;2，新建文件夹C:\DATA\DB，这是mongoDB的默认数据文件夹，你也可以在文件夹E:\MyProgram\mongodb-win32-i386-1.8.2新建一个文件夹data作为mongoDB的数据库文件存储目录&lt;br /&gt;3，进入CMD，运行命令E:\MyProgram\mongodb-win32-i386-1.8.2\bin\mongod.exe -dbpath E:\MyProgram\mongodb-win32-i386-1.8.2\data，OK，mongoDB已经安装成功并已经在运行中了，你将会看到如下：&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/53187/2011062816090760.jpg" /&gt;&lt;/p&gt;&lt;p&gt;此时是mongoDB的运行状态，你可以按Ctrl+C结束运行状态或者直接关掉CMD结束运行。&lt;br /&gt;二，运行mongoDB时的错误与处理&lt;br /&gt;完成安装后，结束掉所有CMD窗口，然后进行如下操作：&lt;br /&gt;1，运行E:\MyProgram\mongodb-win32-i386-1.8.2\bin\mongo，可能会报错误：couldn't connect to server 127.0.0.1 shell/mongo.js，原因是mongod.exe没有启动，&lt;br /&gt;2，既然没启动，那咱就启动呗，运行E:\MyProgram\mongodb-win32-i386-1.8.2\bin\mongod，可能会报错误：dbpath (/data/db/) does not exist, terminating，看这样子，本人觉得还得在data文件夹下再建一个db文件夹啊，如此即新建一db文件夹，再运行mongod命令，结果提示一样，不知道怎么搞啦，咱google吧&lt;br /&gt;找到文章&lt;a href="http://www.mongodb.org/display/DOCS/Starting+and+Stopping+Mongo"&gt;http://www.mongodb.org/display/DOCS/Starting+and+Stopping+Mongo&lt;/a&gt;&lt;br /&gt;说&amp;ldquo;To start Mongo in default mode, where data will be stored in the /data/db directory (or c:\data\db on Windows), and listening on port 27017&amp;rdquo;，哦，原来默认的文档路径在c:\data\db，啥也不说，直接按这个建文件夹，再次运行命令mongod，OK了，启动成功，这个命令窗口不能关闭，否则mongoDB就退出了&lt;/p&gt;&lt;p&gt;三，使用mongo命令&lt;br /&gt;保持mongod命令窗口的运行状态，再新开一命令窗口&lt;br /&gt;输入E:\MyProgram\mongodb-win32-i386-1.8.2\bin\mongo，出现&lt;br /&gt;MongoDB shell version:1.8.2&lt;br /&gt;connecting to:test&lt;br /&gt;&amp;gt;&lt;br /&gt;OK，连接成功。&lt;br /&gt;1，show dbs&amp;nbsp;&amp;nbsp;显示数据库列表&lt;br /&gt;2，use Northwind&amp;nbsp;进入Northwind数据库,大小写敏感&lt;br /&gt;3，show collections&amp;nbsp;显示数据库中的集合&lt;br /&gt;4，db&amp;nbsp;&amp;nbsp;&amp;nbsp;用于查看当前所在的数据库&lt;br /&gt;5，db.Customer.count()&amp;nbsp;查看集合Customer的记录总数&lt;br /&gt;6，db.Customer.findOne({"_id":"1"})&amp;nbsp;查看CustomerId=1的记录&lt;/p&gt;&lt;p&gt;新增数据&lt;br /&gt;1，use MyTest，这个数据库不存在，无所谓，mongo会创建，&lt;br /&gt;MongoDB在使用前，并不要求您事先创建好相应的数据库，设计数据表结构！&lt;br /&gt;在MongoDB中，没有【表】的概念，取而代之的是【集合】，也没有【数据记录】的概念，取而代之的是【文档】，我们可以把【文档】理解成一个【对象】，任意的对象，甚至可以有复杂的嵌套层次。&lt;br /&gt;因此，我们不用再写代码从【数据表字段】到C#类的【属性，字段】的转换了，现在直接就可以读写整个对象了。&lt;br /&gt;而且MongoDB不支持Join操作，所以，如果有【关联】操作，就需要你自己来处理&lt;br /&gt;2，item={"Key":"1","text":"wokao","number":3}&lt;br /&gt;3，db.table1.insert(item)，mongo将建立集合table1，并将item插入，完成了新增加数据库的工作&lt;br /&gt;4，db.table1.find()显示table1中的数据，MongoDB的文档使用的是一种称为BSON格式的对象，与Javascript中的JSON类似&lt;br /&gt;5，额外的，输入item1={"Id":5,"str":"asdfasdf"}，再插入db.table1.insert(item1)，再用find()命令看，也插入成功了~，注意到结构和item不一样！但不建议这样做。&lt;br /&gt;注意到：【每个文档有一个名为 "_id" 的成员】，我可没有定义啊。&lt;br /&gt;其实，MongoDB会为每个文档都创建这样一个文档成员，我们指定的 "key", "id" 对于MongoDB来说：它们并不是【文档的主键】，MongoDB只认 "_id"，你可以指定，但如果不指定，MongoDB就自动添加。 &lt;/p&gt;&lt;p&gt;修改数据&lt;br /&gt;1，var t=db.table1.findOne({"Id":5})，获取一条记录&lt;br /&gt;2，t.str="wokao"&lt;br /&gt;3，db.table1.update({"Id":5},t)&lt;/p&gt;&lt;p&gt;删除数据&lt;br /&gt;db.table1.remove({"Id":5})&lt;/p&gt;&lt;p&gt;查找数据&lt;br /&gt;上面已经有find和findOne命令，即用于查询&lt;br /&gt;db.table1.find()&lt;br /&gt;MongoDB的查询条件中，并没有 &amp;gt;, &amp;lt;, &amp;gt;= , &amp;lt;= 这些运算符，而是使用 "$lt", "$lte", "$gt", "$gte" &lt;/p&gt;&lt;p&gt;新建表&lt;br /&gt;db.MyTest.table2.save({})&lt;/p&gt;&lt;p&gt;删除表&lt;br /&gt;db.table1.drop()或db.runCommand({"drop","table1"})&lt;/p&gt;&lt;p&gt;删除数据库&lt;br /&gt;db.runCommand({"dropDatabase": 1})，此命令只能删除当前数据库&lt;/p&gt;&lt;p&gt;获取服务端状态信息&lt;br /&gt;db.runCommand({"serverStatus" : 1})&lt;/p&gt;&lt;p&gt;更多介绍查看&lt;br /&gt;&lt;a href="http://www.mongodb.org/display/DOCS/Home"&gt;http://www.mongodb.org/display/DOCS/Home&lt;/a&gt;&lt;/p&gt;&lt;p&gt;在&lt;a href="https://github.com/samus/mongodb-csharp"&gt;https://github.com/samus/mongodb-csharp&lt;/a&gt;可以下到C#的示例&lt;/p&gt;&lt;img src="http://www.cnblogs.com/bestfc/aggbug/2092400.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/bestfc/archive/2011/06/28/MongoDB.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/bestfc/archive/2010/10/26/spark1.html</id><title type="text">ASP.NET MVC视图引擎SPARK文档中文版（一）</title><summary type="text">一，前言 写个前言还是不错的，可以先让大家看看这个文章是个大体什么内容，然后打酱油的打酱油，路过的继续路过，但相信停下来总有些许收获。 很久没有写东西，一个最近挺忙，二个好像没有什么特别好的内容好写，三个没有什么很好的心得与大家分享。最近一个项目前台使用MVC，用到了SPARK引擎，感觉灰常好用，不敢私藏，拿出来给大家分享一下，而又因为关于SPARK的中文资料简直可以说是没有，所以这篇大家可以认为...</summary><published>2010-10-26T02:11:00Z</published><updated>2010-10-26T02:11:00Z</updated><author><name>黑曜石</name><uri>http://www.cnblogs.com/bestfc/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bestfc/archive/2010/10/26/spark1.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bestfc/archive/2010/10/26/spark1.html"/><content type="html">&lt;p&gt;&lt;span style="font-size: 12pt;"&gt;&lt;em&gt;&lt;strong&gt;一，前言&lt;/strong&gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 写个前言还是不错的，可以先让大家看看这个文章是个大体什么内容，然后打酱油的打酱油，路过的继续路过，但相信停下来总有些许收获。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 很久没有写东西，一个最近挺忙，二个好像没有什么特别好的内容好写，三个没有什么很好的心得与大家分享。最近一个项目前台使用MVC，用到了SPARK引擎，感觉灰常好用，不敢私藏，拿出来给大家分享一下，而又因为关于SPARK的中文资料简直可以说是没有，所以这篇大家可以认为是翻译，只是翻译水平比较差点，大家凑合了，如果有高手指出不足最好了，抛砖引玉了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ASP.NET&amp;nbsp;MVC 现在已有四种主要的视图引擎：Spark、NHaml、Razor和传统的ASPX文件模板，Razor是新生事物，传统的ASPX文件模板做过MVC的大体都有了解和应用了，而Spark和NHaml似乎用得不是很多，很有可能是中文资料欠缺，导致连了解的都不多。本人是在搜索关键词ASP.NET MVC SPARK，百度和GOOGLE都是一篇：《ASP.NET MVC的四种视图引擎》，文章只是粗略的写了一下各个视图的特点，确实是让大家有了一点点的了解。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 本文基本上算是Spark官方文档的翻译，其网址是：&lt;a href="http://sparkviewengine.com/documentation"&gt;http://sparkviewengine.com/documentation&lt;/a&gt;，最近网络河蟹乱爬，如果打不开，请大家自行翻墙！&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;二，将Spark加载到Asp.Net MVC中&lt;/strong&gt;&lt;/em&gt;&lt;br /&gt;Spark引擎不被controller管理，最简单的方法是在Asp.Net MVC web应用程序中将SparkViewFactory在Global Application_Start中注册，如：&lt;br /&gt;protected void Application_Start(object sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ViewEngines.Engines.Add(new SparkViewFactory());&lt;br /&gt;}&lt;br /&gt;这也是注册其它非默认视图引擎的方法&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;三，Spark配置&lt;/strong&gt;&lt;/em&gt;&lt;br /&gt;1，web.config中的配置&lt;br /&gt;所有的spark配置都包括在&amp;lt;spark&amp;gt;标签中，如：&lt;br /&gt;&amp;lt;!--增加spark配置名--&amp;gt;&lt;br /&gt;&amp;lt;configSections&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;section name="spark" type="Spark.Configuration.SparkSectionHandler, Spark"/&amp;gt;&lt;br /&gt;&amp;lt;/configSections&amp;gt;&lt;br /&gt;&amp;lt;!--spark配置主体--&amp;gt;&lt;br /&gt;&amp;lt;spark&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;compilation debug="true|false" defaultLanguage="Default|CSharp|VisualBasic"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;assemblies&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add assembly="YourAssemblyName" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add assembly="YourOtherStrongAssemblyName, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/assemblies&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/compilation&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;pages automaticEncoding="true|false" pageBaseType="Your.NonDefault.BaseSparkView" prefix="{optional string}"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;namespaces&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add namespace="System"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add namespace="System.Collections.Generic"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add namespace="System.Linq"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add namespace="System.Web.Mvc"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/namespaces&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;resources&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add match="/content/css" location="&lt;a href="http://www.yourcdnprovider.com/youraccount/allstyles/css&amp;quot;/"&gt;http://www.yourcdnprovider.com/youraccount/allstyles/css"/&lt;/a&gt;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add match="/content/js" location="&lt;a href="http://www.yourcdnprovider.com/youraccount/appname/js&amp;quot;/"&gt;http://www.yourcdnprovider.com/youraccount/appname/js"/&lt;/a&gt;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/resources&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/pages&amp;gt;&lt;br /&gt;&amp;lt;/spark&amp;gt;&lt;br /&gt;自动解码最好是true，这将会对每个使用${expr}的操作符都进行HTML encoding，而使用方法!{expr}将避免被解码&lt;br /&gt;resources区域用于控制形如&amp;rdquo;~/&amp;ldquo;样式的链接，如：&amp;lt;script src="~/content/js/foo.js"/&amp;gt;，将会被解析成给定的location+"/foo.js"，对于使用静态文件或CDN来说是非常有意义的。&lt;/p&gt;&lt;p&gt;2，也可以在Application_Start中配置，如：&lt;br /&gt;protected void Application_Start(object sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var settings = new SparkSettings()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .SetDebug(true)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .SetPageBaseType("Your.NonDefault.BaseSparkView")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .AddAssembly("YourAssembly")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .AddNamespace("System")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .AddNamespace("System.Collections.Generic")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .AddNamespace("System.Linq")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .AddNamespace("System.Web.Mvc");&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ViewEngines.Engines.Add(new SparkViewFactory(settings));&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;四，常规语法&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;1，包含代码&lt;br /&gt;可以使用包括C#代码，任何helper方法，对象属性或返回非空值的表达式，如：&lt;br /&gt;&amp;lt;p&amp;gt;${"Hello world"}&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;${Guid.NewGuid().ToString("n")}&amp;lt;/p&amp;gt;&lt;br /&gt;代码可以表现为特殊的html标签或其属性，如"if","else"和"var"，在这些代码的区域中将不需要使用${}，如：&lt;br /&gt;&amp;lt;var names="new [] {'alpha', 'beta', 'gamma'}"/&amp;gt;&lt;br /&gt;&amp;lt;for each="var name in names"&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;test if="name == 'beta'"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;p&amp;gt;beta is my favorite.&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;else/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;p&amp;gt;${name} is okay too I suppose. &lt;br /&gt;&amp;nbsp; &amp;lt;/test&amp;gt;&lt;br /&gt;&amp;lt;/for&amp;gt;&lt;br /&gt;但如果你想输出一个普通标签的属性时，标记符号还是需要加上的，如：&lt;br /&gt;&amp;lt;viewdata currentProduct="Product"/&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;${currentProduct.Name} &amp;lt;a href="/Product/Edit/${currentProduct.Id}"&amp;gt;Edit&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;/p&gt;&lt;p&gt;2，代码中的特殊字符&lt;br /&gt;可以使用所有的C#代码，但是请小心使用，确保你的商业逻辑都写在你的controller或其它代码中&lt;br /&gt;只有很少一部分的代码需要使用特殊的方法去避免被错误解析，如使用[[和]]代替&amp;lt;&amp;gt;，另外，在属性中如果使用了双引号，那么属性中如果使用了spark语法的字符型值时，则需要使用单引号；如果使用单个char常量，使用(char)'x'代替"x"，如：&lt;br /&gt;&amp;lt;viewdata products="IList[[Products]]"/&amp;gt;&lt;br /&gt;&amp;lt;var styles="new[] {'even', 'odd'}"/&amp;gt;&lt;/p&gt;&lt;p&gt;3，配置使用Spark前缀&lt;br /&gt;默认情况下，Spark标签是不需要其它特殊标记的，但是当使用Spark生成xml或xhtml时，配置spark前缀就有必要了，方法如下：&lt;br /&gt;&amp;lt;spark&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;pages prefix="s"/&amp;gt;&lt;br /&gt;&amp;lt;/spark&amp;gt;&lt;br /&gt;Or &lt;br /&gt;var settings = new SparkSettings()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .SetPrefix("s");&lt;br /&gt;当配置了前缀时，每个spark标签或属性都需要以前缀开头，以被spark引擎识别，而spark内置的标签如macro:,content:,use:和section:不需要加前缀，如:&lt;br /&gt;&amp;lt;div&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;s:viewdata user="UserInfo"/&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;p s:if="user != null"&amp;gt;${user.Name}&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;s:LoginForm/&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;/p&gt;&lt;p&gt;4，引入xmlns namespaces至Spark标签中&lt;br /&gt;这个不是太好理解，直接上例子：&lt;br /&gt;&amp;lt;html xmlns="&lt;a href="http://www.w3.org/1999/xhtml"&gt;http://www.w3.org/1999/xhtml&lt;/a&gt;"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:s="&lt;a href="http://sparkviewengine.com/"&gt;http://sparkviewengine.com/&lt;/a&gt;"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:fn="&lt;a href="http://sparkviewengine.com/macro/"&gt;http://sparkviewengine.com/macro/&lt;/a&gt;"&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;fn:ShowNames favorite="string"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;s:var names="new [] {'alpha', 'beta', 'gamma'}"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;s:for each="var name in names"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;s:test if="name == favorite"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;p&amp;gt;${favorite} is my favorite.&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;s:else/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;p&amp;gt;${name} is okay too I suppose.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/s:test&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/s:for&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/fn:ShowNames&amp;gt;&lt;br /&gt;&amp;nbsp; ${ShowNames("beta")}&lt;br /&gt;&amp;nbsp; ${ShowNames("gamma")}&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;五，变量&lt;/strong&gt;&lt;/em&gt;&lt;br /&gt;1，声明局部变量&lt;br /&gt;使用&amp;rdquo;var&amp;ldquo;标签可以简单快速的声明局部变量，默认的行为将会是生成一个有初始值的局部动态变量类型&amp;rdquo;var&amp;ldquo;，如：&lt;br /&gt;&amp;lt;var styles="new [] {'odd', 'even'}" i="0"/&amp;gt;&lt;br /&gt;将产生如下：&lt;br /&gt;var styles = new [] {"odd", "even"};&lt;br /&gt;var i = 0;&lt;br /&gt;&amp;rdquo;var&amp;ldquo;标签有一个&amp;rdquo;type&amp;ldquo;属性，可以指明变量的类型，如：&lt;br /&gt;&amp;lt;var foo="null" bar="null" type="string"/&amp;gt;&lt;br /&gt;将产生如下：&lt;br /&gt;string foo = null;&lt;br /&gt;string bar = null;&lt;br /&gt;最后，如果&amp;rdquo;var&amp;ldquo;标签没有在一个以&amp;rdquo;/&amp;gt;&amp;ldquo;结尾的标签内声明，变量将会有一个作用域，作用域以&amp;rdquo;&amp;lt;/var&amp;gt;&amp;ldquo;结束，在作用域外不将不能对变量进行赋值，如：&lt;br /&gt;&amp;lt;div&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;var styles="new [] {'even', 'odd'}" i="0"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;p&amp;gt;${i} is ${styles[i%2]}&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/var&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;set i="5"/&amp;gt; &amp;lt;!-- compiler error - variable i is out of scope --&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;将产生如下：&lt;br /&gt;Output.Write("&amp;lt;div&amp;gt;");&lt;br /&gt;{&lt;br /&gt;var styles=new[] {"even", "odd"};&lt;br /&gt;var i = 0;&lt;br /&gt;Output.Write("&amp;lt;p&amp;gt;");&lt;br /&gt;Output.Write(i);&lt;br /&gt;Output.Write(" is ");&lt;br /&gt;Output.Write(styles[i%2]);&lt;br /&gt;Output.Write("&amp;lt;/p&amp;gt;");&lt;br /&gt;}&lt;br /&gt;Output.Write("&amp;lt;/div&amp;gt;");&lt;br /&gt;i = 5;&lt;/p&gt;&lt;p&gt;2，声明全局变量&lt;br /&gt;局部变量有其作用域，而全局变量可以在view，master或局部模板文件中声明，其值可以在任何地方使用，如：&lt;br /&gt;&amp;lt;h2&amp;gt;${Title}&amp;lt;/h2&amp;gt;&lt;br /&gt;&amp;lt;global Title="'My Default Title'"/&amp;gt;&lt;br /&gt;注意到其值是以双引号包围，内部还有单引号（可以理解为双引号是因为HTML标签属性值要以双引号包含，而内部是string类型，用单引号避免外部双引号重复使用）&lt;br /&gt;全局变量实际上将会以视图类中的一个字段成员执行，所以上面例子中将将产生一个object Title="My Default Title"的字段成员，任何方法都可以引用这个变量，spark仍然提供一个&amp;rdquo;type&amp;ldquo;属性声明具体类型以避免使用object类型，另外，多个变量可以声明要同一个标签中，如：&lt;br /&gt;&amp;lt;global type="string" Foo="'Hello'" Bar="'World'" /&amp;gt;&lt;/p&gt;&lt;p&gt;3，设置局部和全局变量的值&lt;br /&gt;${expr}和其它语法只是用于输出值，局部或全局变量的赋值需要使用&amp;rdquo;set&amp;ldquo;标签，如：&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;head&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;global type='string' Title='"Site Name"'/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;title&amp;gt;${Title}&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/head&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;body&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div&amp;gt;&amp;lt;use content="view"/&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;在视图中设置Title的值&lt;br /&gt;&amp;lt;set Title='product.Name + " - " + Title'/&amp;gt;&lt;br /&gt;&amp;lt;!-- or --&amp;gt;&lt;br /&gt;&amp;lt;set Title='string.Format("{0} - {1}", product.Name, Title)'/&amp;gt;&lt;/p&gt;&lt;p&gt;4，使用view data&lt;br /&gt;ViewData作为一个对象字典可以使用形如${ViewData["blah"]}来使用，但是建议使用一个强类型的ViewData将会使操作更为简便，如：&lt;br /&gt;&amp;lt;viewdata &lt;br /&gt;&amp;nbsp; Caption="string" &lt;br /&gt;&amp;nbsp; Products="System.Collections.Generic.IList[[MyApp.Models.Product]]"/&amp;gt;&lt;br /&gt;&amp;lt;div&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;h3&amp;gt;${Caption}&amp;lt;/h3&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;div&amp;nbsp; each="var product in Products"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h4&amp;gt;${product.Name}&amp;lt;/h4&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div&amp;gt;${product.Description}&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;ViewData标签可以声明在view中或是master文件中，结果都是一样的，如：&lt;br /&gt;string Caption &lt;br /&gt;{get {return (string)ViewData["Caption"];}}&lt;/p&gt;&lt;p&gt;System.Collections.Generic.IList&amp;lt;MyApp.Models.Product&amp;gt; Products &lt;br /&gt;{get {return (System.Collections.Generic.IList&amp;lt;MyApp.Models.Product&amp;gt;)ViewData["Products"];}}&lt;br /&gt;在这种情况下，需要使用[[and]]来代替&amp;lt;and&amp;gt;&lt;/p&gt;&lt;p&gt;5，使用view data中的确定类型的model&lt;br /&gt;在view或master文件中viewdata可能有一个model的属性&lt;br /&gt;&amp;lt;viewdata model="MyApp.Models.Catalog"/&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;(${ViewData.Model.CatalogID}) ${ViewData.Model.Name} &amp;lt;/p&amp;gt;&lt;br /&gt;model的属性可以和其它viewdata中的变量声明共同使用，例如在master文件中使用了一个&amp;lt;viewdata Title="string"/&amp;gt;，在view中仍然可以使用含有一个Title属性的string字段的model，&amp;lt;viewdata model="typename"/&amp;gt;&lt;br /&gt;&amp;lt;viewdata Title="string"/&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;${Html.Encode(Title ?? "My Sample MVC Application")}&amp;lt;/title&amp;gt;&lt;br /&gt;这一段不好理解，建议大家可以看看英文原文&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;六，表达式&lt;/strong&gt;&lt;/em&gt;&lt;br /&gt;1，简单的C#表达式&lt;br /&gt;可以使用${expr}或&amp;lt;%=expr%&amp;gt;&lt;br /&gt;例：&lt;br /&gt;&amp;lt;div&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;p&amp;gt;The time is ${DateTime.Now}.&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;p&amp;gt;The time is &amp;lt;%=DateTime.Now%&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;/p&gt;&lt;p&gt;2，Nulls表达式&lt;br /&gt;当使用简单的C#表达式时，如果值为null时，将会输出错误，此时可以使用$!{expr}来避免输出错误，只是输出空值&lt;br /&gt;&amp;lt;div class="shipto"&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;p&amp;gt;$!{currentInvoice.ShipTo.FullName}&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;p&amp;gt;$!{currentInvoice.ShipTo.Address.City}, $!{currentInvoice.ShipTo.Address.State} $!{currentInvoice.ShipTo.Address.Zip}&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;如果是currentInvoice为null或ShipTo为null时，将会输出如下：&lt;br /&gt;&amp;lt;div class="shipto"&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;p&amp;gt;,&amp;nbsp; &amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;这个主意不是太好，不过总比一个乱码错误页好许多，所以确定你的值100%不为空吧&lt;/p&gt;&lt;p&gt;3，使用MVC helpers&lt;br /&gt;可以使用HtmlHelper,UrlHelper和AjaxHelper&lt;br /&gt;&amp;lt;!-- Link to the Sort action on the current controller --&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;${Html.ActionLink("Click me", "Sort")}&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;!-- Put out data in a way that's safe --&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;${Html.Encode(stuff)}&amp;lt;/p&amp;gt;&lt;/p&gt;&lt;p&gt;4，条件标签：if，test和else&lt;br /&gt;使用例子说明：&lt;br /&gt;例1：&lt;br /&gt;&amp;lt;var x='5'/&amp;gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;lt;if condition='x == 5'&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;p class='resultmessage'&amp;gt;Some value is five&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;/if&amp;gt;&lt;br /&gt;例2：&lt;br /&gt;&amp;lt;viewdata user='UserInfo'/&amp;gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;lt;if condition='!user.IsLoggedIn()'&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;p&amp;gt;Here's a login form&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;/if&amp;gt;&lt;br /&gt;&amp;lt;else if='user.HasRole(RoleType.Administrator)'&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;p&amp;gt;Hello - you're an admin&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;/else&amp;gt;&lt;br /&gt;&amp;lt;else if='user.HasRole(RoleType.Registered)'&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;p&amp;gt;Hello - you're a registered user&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;/else&amp;gt;&lt;br /&gt;&amp;lt;else&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;p&amp;gt;I have no idea what type of person you are&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;/else&amp;gt;&lt;br /&gt;例3：&lt;br /&gt;可以使用&amp;lt;test if=""&amp;gt;语法来代替&amp;lt;if condition=""&amp;gt;语法，&amp;lt;else if=""/&amp;gt;和&amp;lt;else/&amp;gt;来代替分散标签&lt;br /&gt;&amp;lt;viewdata user='UserInfo'/&amp;gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;lt;test if='!user.IsLoggedIn()'&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;p&amp;gt;Here's a login form&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;else if='user.HasRole(RoleType.Administrator)'/&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;p&amp;gt;Hello - you're an admin&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;else if='user.HasRole(RoleType.Registered)'/&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;p&amp;gt;Hello - you're a registered user&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;else/&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;p&amp;gt;I have no idea what type of person you are&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;/test&amp;gt;&lt;/p&gt;&lt;p&gt;5，使用if和elseif判断属性或标签显示&lt;br /&gt;if和elseif可以使用在任何标签中&lt;br /&gt;例1：&lt;br /&gt;&amp;lt;var x='5'/&amp;gt; &lt;br /&gt;&amp;lt;p if='x==5' class='resultmessage'&amp;gt;Some value is five&amp;lt;/p&amp;gt;&lt;br /&gt;例2：&lt;br /&gt;&amp;lt;use namespace='SampleApp.Models'/&amp;gt;&lt;br /&gt;&amp;lt;viewdata user='UserInfo'/&amp;gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;lt;p if='!user.IsLoggedIn()'&amp;gt;Here's a login form&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;p elseif='user.HasRole(RoleType.Administrator)'&amp;gt;Hello - you're an admin&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;p elseif='user.HasRole(RoleType.Registered)'&amp;gt;Hello - you're a registered user&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;else&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;p&amp;gt;I have no idea what type of person you are&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;/else&amp;gt;&lt;/p&gt;&lt;p&gt;6，一次判断&lt;br /&gt;在页面中只需要调入一次某个资源，如css文件或jquery，可标签中使用once="flagname"还指明，你当然可以使用${expr}或其它语法来为flagname赋值，实际上在spark文件的任何地方都可以使用这样的表达式&lt;br /&gt;&amp;lt;content name="head"&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;!--&amp;nbsp; add jquery if it hasn't been yet, and add countdown plugin --&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;script once="jquery" type="text/javascript" src="~/content/js/jquery-1.2.6.js"/&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;script once="jquery-countdown" type="text/javascript" src="~/content/js/jquery.countdown.js"/&amp;gt;&lt;br /&gt;&amp;lt;/content&amp;gt;&lt;br /&gt;这里不是太明白&lt;/p&gt;&lt;p&gt;7，有条件的属性输出&lt;br /&gt;使用?{boolean}表达式只能用在属性值中，例：&lt;br /&gt;&amp;lt;ul&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;li each="var product in Products" class="first?{productIsFirst} last?{productIsLast}"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ${H(product.Name)}&lt;br /&gt;&amp;nbsp; &amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;将会输出&lt;br /&gt;&amp;lt;ul&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;li class="first"&amp;gt;Alpha&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;li&amp;gt;Beta&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;li&amp;gt;Gamma&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;li class=" last"&amp;gt;Delta&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;or&lt;br /&gt;&amp;lt;ul&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;li class="first last"&amp;gt;just one product&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;如果属性值为空，那么将表现如下：&lt;br /&gt;&amp;lt;input type="checkbox" name="chkhello" checked="?{isHelloChecked}"&amp;gt;&amp;lt;/input&amp;gt;&lt;br /&gt;将会输出&lt;br /&gt;&amp;lt;input type="checkbox" name="chkhello" checked=""&amp;gt;&amp;lt;/input&amp;gt;&lt;br /&gt;or&lt;br /&gt;&amp;lt;input type="checkbox" name="chkhello"&amp;gt;&amp;lt;/input&amp;gt;&lt;/p&gt;&lt;p&gt;8，循环&lt;br /&gt;一个foreach循环包含标签for和each属性，each属性值必须包含类型，变量名，关键字"in"和循环体（collection），如：&lt;br /&gt;&amp;lt;viewdata Posts="IList[[MyApp.Models.Post]"/&amp;gt;&lt;br /&gt;&amp;lt;for each="var post in Posts"&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;p&amp;gt;${post.Title}&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;/for&amp;gt;&lt;br /&gt;任何一个循环都有Index，Count，IsFirst和IsLast属性，在循环作用域内有效，而且只有被使用了才会生成，如：&lt;br /&gt;&amp;lt;viewdata Posts="IList[[MyApp.Models.Post]"/&amp;gt;&lt;br /&gt;&amp;lt;var styles="new[] {'even','odd'}"/&amp;gt;&lt;br /&gt;&amp;lt;for each="var post in Posts"&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;p class="${styles[postIndex%2]}"&amp;gt;${postIndex}. ${post.Title}&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;/for&amp;gt;&lt;br /&gt;在循环时，如果使用了Count或IsLast变量，spark将会使用IEnumerable&amp;lt;T&amp;gt;的Linq方法后，使用Count()取得，而旧的spark引擎会先循环一次以取得count，所以使用Count和IsLast时，请注意性能问题&lt;br /&gt;以下是局部变量和循环的复杂使用&lt;br /&gt;&amp;lt;viewdata currentProductId="int"/&amp;gt;&lt;br /&gt;&amp;lt;var styles="new [] {'even', 'odd'}" isCurrent="false"&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;for each="var product in Products" isCurrent="product.Id==currentProductId"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;p class="highlighted?{isCurrent} ${styles[productIndex%2]}"&amp;gt;${Html.Encode(product.Name)}&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/for&amp;gt;&lt;br /&gt;&amp;lt;/var&amp;gt;&lt;/p&gt;&lt;p&gt;9，在标签属性中使用循环&lt;br /&gt;例1：&lt;br /&gt;&amp;lt;table&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;Name&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;Type&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;tr each='var user in users'&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;${user.Name}&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;${user.UserType}&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;br /&gt;例2：&lt;br /&gt;&amp;lt;table&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;Name&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;Type&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;var classes="new [] {'even','odd'}"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tr each="var user in users" class="${classes[userIndex%2]}"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;${userIndex}) ${user.Name}&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;${user.UserType}&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/var&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;/p&gt;&lt;p&gt;10，使用命名空间&lt;br /&gt;&amp;lt;use namespace="System.Collections.Generic"/&amp;gt;&lt;br /&gt;&amp;lt;use namespace="System.Web.Mvc"/&amp;gt;&lt;br /&gt;&amp;lt;viewdata Names="IList[[string]]"/&amp;gt;&lt;br /&gt;不好说明&lt;/p&gt;&lt;p&gt;11，内置代码&lt;br /&gt;使用&amp;rdquo;#&amp;ldquo;符号声明当前行为C#代码，如：&lt;br /&gt;&amp;lt;test if="user.IsLoggedIn()"&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;p&amp;gt;Hello, ${user.Name}.&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;else if="user.HasValidTrialSession()"/&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;p&amp;gt;Hello, Valued Future Customer.&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;else/&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;p&amp;gt;Hello, er... you.&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;nbsp; # System.Diagnostic.Trace.WriteLine("Unexpected anon user.");&lt;br /&gt;&amp;nbsp; # if (System.Diagnostic.Debugger.IsAttached)&lt;br /&gt;&amp;nbsp; #&amp;nbsp;&amp;nbsp; System.Diagnostic.Debugger.Break();&lt;br /&gt;&amp;lt;/test&amp;gt;&lt;br /&gt;这里需要说明的是spark变量和C#变量是可以通用的！&lt;/p&gt;&lt;p&gt;12，声明宏&lt;br /&gt;当需要一个helper方法时，如需要输入一些参数和返回一个字符串时，&amp;lt;macro&amp;gt;就可以做这些事情了，声明时使用形如&amp;lt;macro name="foot"&amp;gt;，然后使用时用${foo()}或&amp;lt;%=foo()%&amp;gt;，例：&lt;br /&gt;&amp;lt;viewdata errorMessage="string" /&amp;gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;lt;macro name="ShowError" caption="string" message="string"&amp;gt;&lt;br /&gt;&amp;lt;div class="message error"&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;h3&amp;gt;${H(caption)}&amp;lt;/h3&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;div&amp;gt;${message}&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;% Logger.Warn(caption); %&amp;gt; &amp;lt;!-- this is a MR example. asp.net mvc would use different logging --&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/macro&amp;gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;lt;h2&amp;gt;Place Order&amp;lt;/h2&amp;gt;&lt;br /&gt;&amp;lt;test if="!string.IsNullOrEmpty(errorMessage)"&amp;gt;&lt;br /&gt;&amp;nbsp; ${ShowError("Failed to place order", errorMessage)}&lt;br /&gt;&amp;lt;/test&amp;gt;&lt;br /&gt;将会产生如下：&lt;br /&gt;string ShowError(string caption, string message)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; using(OutputScope(new System.IO.StringWriter())) &lt;br /&gt;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Output.Write("\r\n&amp;nbsp; &amp;lt;div class=\"message error\"&amp;gt;\r\n&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h3&amp;gt;");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Output.Write(H(caption));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Output.Write("&amp;lt;/h3&amp;gt;\r\n&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div&amp;gt;");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Output.Write(message);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Output.Write("&amp;lt;/div&amp;gt;\r\n&amp;nbsp;&amp;nbsp;&amp;nbsp; ");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Logger.Warn(caption);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Output.Write("&amp;nbsp; &amp;lt;/div&amp;gt;\r\n");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return Output.ToString(); &lt;br /&gt;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&amp;nbsp;&lt;br /&gt;//... and in the RenderViewContent method&lt;br /&gt;Output.Write("\r\n&amp;lt;h2&amp;gt;Place Order&amp;lt;/h2&amp;gt;\r\n");&lt;br /&gt;if (!string.IsNullOrEmpty(errorMessage)) &lt;br /&gt;{&lt;br /&gt;&amp;nbsp; Output.Write(ShowError("Failed to place order", errorMessage));&lt;br /&gt;} // if (!string.IsNullOrEmpty(errorMessage))&lt;br /&gt;Output.Write("\r\n\r\n&amp;lt;!-- form here, field validation messages, etc. --&amp;gt;\r\n\r\n");&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;太多了，今天先写到这，觉得不错，麻烦推荐一个&lt;/p&gt;&lt;img src="http://www.cnblogs.com/bestfc/aggbug/1861197.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/bestfc/archive/2010/10/26/spark1.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/bestfc/archive/2010/10/14/1851065.html</id><title type="text">JS面向对象、prototype、call()、apply()和实例</title><summary type="text">文章排版有问题，首先是转载，地址：http://jaychaoqun.javaeye.com/blog/392110接下来是理解之后的实例</summary><published>2010-10-14T03:18:00Z</published><updated>2010-10-14T03:18:00Z</updated><author><name>黑曜石</name><uri>http://www.cnblogs.com/bestfc/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bestfc/archive/2010/10/14/1851065.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bestfc/archive/2010/10/14/1851065.html"/><content type="html">&lt;p&gt;文章排版有问题，首先是转载，地址：&lt;a href="http://jaychaoqun.javaeye.com/blog/392110"&gt;http://jaychaoqun.javaeye.com/blog/392110&lt;/a&gt;&lt;/p&gt;&lt;p&gt;接下来是理解之后的实例&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;br/&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&amp;gt;&lt;br/&gt;&amp;lt;head&amp;gt;&lt;br/&gt;&amp;lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&amp;gt;&lt;br/&gt;&amp;lt;title&amp;gt;简易拖放效果&amp;lt;/title&amp;gt;&lt;br/&gt;&amp;lt;/head&amp;gt;&lt;br/&gt;&amp;lt;body&amp;gt;&lt;br/&gt;&amp;lt;script&amp;gt;&lt;br/&gt;//参考：http://www.javaeye.com/topic/57760&lt;br/&gt;//http://jaychaoqun.javaeye.com/blog/392110&lt;br/&gt;&lt;br/&gt;//简化id选择器&lt;br/&gt;var isIE = (document.all) ? true : false;&lt;br/&gt;var $ = function (id) {&lt;br/&gt;return "string" == typeof id ? document.getElementById(id) : id;&lt;br/&gt;};&lt;br/&gt;&lt;br/&gt;//初始化一个 Class 对象， 它有一个成员，是一个方法， 这个方法返因另一个方法（方法是对象，所以可以作为参数或者返回值）&lt;br/&gt;var Class = {&lt;br/&gt;create: function() {&lt;br/&gt;return function() {//使用new操作符时，就会在新产生的对象上调用这个方法&lt;br/&gt;this.initialize.apply(this, arguments); //这里就是调用 this 对象上的 initialize方法， 并传递 arguments，这里的this是new之后构造出来的对象&lt;br/&gt;}&lt;br/&gt;}&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;//继承，这里没有用到&lt;br/&gt;var Extend = function(destination, source) {&lt;br/&gt;for (var property in source) {&lt;br/&gt;destination[property] = source[property];&lt;br/&gt;}&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;//参数传递&lt;br/&gt;//object参数，fun方法&lt;br/&gt;var Bind = function(object, fun) {&lt;br/&gt;return function() {&lt;br/&gt;return fun.apply(object, arguments);&lt;br/&gt;}&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;//事件传递&lt;br/&gt;//object参数，fun方法&lt;br/&gt;var BindAsEventListener = function(object, fun) {&lt;br/&gt;return function(event) {&lt;br/&gt;return fun.call(object, (event || window.event));&lt;br/&gt;}&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;//事件绑定&lt;br/&gt;//oTarget绑定目标，sEventType事件类型，fnHandler事件方法&lt;br/&gt;function addEventHandler(oTarget, sEventType, fnHandler) {&lt;br/&gt;if (oTarget.addEventListener) {//FF&lt;br/&gt;oTarget.addEventListener(sEventType, fnHandler, false);&lt;br/&gt;} else if (oTarget.attachEvent) {//IE&lt;br/&gt;oTarget.attachEvent("on" + sEventType, fnHandler);&lt;br/&gt;} else {&lt;br/&gt;oTarget["on" + sEventType] = fnHandler;&lt;br/&gt;}&lt;br/&gt;};&lt;br/&gt;&lt;br/&gt;//移除事件绑定&lt;br/&gt;//oTarget绑定目标，sEventType事件类型，fnHandler事件方法&lt;br/&gt;function removeEventHandler(oTarget, sEventType, fnHandler) {&lt;br/&gt;    if (oTarget.removeEventListener) {//FF&lt;br/&gt;        oTarget.removeEventListener(sEventType, fnHandler, false);&lt;br/&gt;    } else if (oTarget.detachEvent) {//IE&lt;br/&gt;        oTarget.detachEvent("on" + sEventType, fnHandler);&lt;br/&gt;    } else { &lt;br/&gt;        oTarget["on" + sEventType] = null;&lt;br/&gt;    }&lt;br/&gt;};&lt;br/&gt;&lt;br/&gt;//SimpleDrag是一个方法，方法体，这里相当于一个类&lt;br/&gt;var SimpleDrag = Class.create();&lt;br/&gt;SimpleDrag.prototype = {&lt;br/&gt;  //对象初始化，实现Class中的this.initialize&lt;br/&gt;  initialize: function(drag) {&lt;br/&gt;this.Drag = $(drag);//绑定目标&lt;br/&gt;this._x = this._y = 0;//初始值&lt;br/&gt;this._fnMove = BindAsEventListener(this, this.Move);&lt;br/&gt;this._fnStop = Bind(this, this.Stop);&lt;br/&gt;this.Drag.style.position = "absolute";&lt;br/&gt;addEventHandler(this.Drag, "mousedown", BindAsEventListener(this, this.Start));//监听鼠标按下事件&lt;br/&gt;  },&lt;br/&gt;  //准备拖动&lt;br/&gt;  Start: function(oEvent) {&lt;br/&gt;this._x = oEvent.clientX - this.Drag.offsetLeft;&lt;br/&gt;this._y = oEvent.clientY - this.Drag.offsetTop;&lt;br/&gt;addEventHandler(document, "mousemove", this._fnMove);//对象开始拖动后，监听鼠标移动事件&lt;br/&gt;addEventHandler(document, "mouseup", this._fnStop);//同时监听鼠标放开事件&lt;br/&gt;  },&lt;br/&gt;  //拖动&lt;br/&gt;  Move: function(oEvent) {&lt;br/&gt;this.Drag.style.left = oEvent.clientX - this._x + "px";&lt;br/&gt;this.Drag.style.top = oEvent.clientY - this._y + "px";&lt;br/&gt;  },&lt;br/&gt;  //停止拖动&lt;br/&gt;  Stop: function() {&lt;br/&gt;removeEventHandler(document, "mousemove", this._fnMove);&lt;br/&gt;removeEventHandler(document, "mouseup", this._fnStop);&lt;br/&gt;  }&lt;br/&gt;};&lt;br/&gt;&amp;lt;/script&amp;gt;&lt;br/&gt;&amp;lt;div id="idDrag" style="border:5px solid #0000FF; background:#C4E3FD; width:50px; height:50px;"&amp;gt;&amp;lt;/div&amp;gt;&lt;br/&gt;&amp;lt;script&amp;gt;&lt;br/&gt;new SimpleDrag("idDrag");&lt;br/&gt;&amp;lt;/script&amp;gt;&lt;br/&gt;&amp;lt;/body&amp;gt;&lt;br/&gt;&amp;lt;/html&amp;gt;&lt;br/&gt;&lt;br/&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/bestfc/aggbug/1851065.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/bestfc/archive/2010/10/14/1851065.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/bestfc/archive/2010/08/02/1790173.html</id><title type="text">javascript没那么简单</title><summary type="text">写在前面：似乎园子里最近少了些人，各个文章的阅读量少了许多废话不说，写此文目的是为了让更多的程序员理解javascript的一些概念，对是理解不是了解我们已经了解得够多了，该是向深入理解的方向靠拢的时候了为什么这么说，前些日子收到面试邀请，那就去试试呗，有几年没有面试过了吧和面试官坐在沙发上，聊天式的他问我答，以下就是几个javascript方面的问题&gt;请创建一个对象，包括几个公有属性，接下...</summary><published>2010-08-02T01:07:00Z</published><updated>2010-08-02T01:07:00Z</updated><author><name>黑曜石</name><uri>http://www.cnblogs.com/bestfc/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bestfc/archive/2010/08/02/1790173.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bestfc/archive/2010/08/02/1790173.html"/><content type="html">&lt;p&gt;&lt;em&gt;写在前面&lt;/em&gt;：&lt;br /&gt;似乎园子里最近少了些人，各个文章的阅读量少了许多&lt;br /&gt;废话不说，写此文目的是为了让更多的程序员理解javascript的一些概念，对是理解不是了解&lt;br /&gt;我们已经了解得够多了，该是向深入理解的方向靠拢的时候了&lt;br /&gt;为什么这么说，前些日子收到面试邀请，那就去试试呗，有几年没有面试过了吧&lt;br /&gt;和面试官坐在沙发上，聊天式的他问我答，以下就是几个javascript方面的问题&lt;br /&gt;&amp;gt;请创建一个对象，包括几个公有属性，接下来是为对象创建一个公有方法，然后为对象创建几个私有属性，一个私有方法&lt;br /&gt;说实话，这几个问题我默名其妙，要是他让我用jquery写个拖动插件什么的，我估计我能写挺好，原生的javascript，晕，虽然我看过jquery源码解读，但这些基本概念要命&lt;br /&gt;稍后，我会在正文中将答案写出来&lt;br /&gt;如果面试官在看，说声谢谢，面试完之后我就去深圳购书中心买javascript去了，好贵，呵呵，看中之后，到卓越定了一个《javascript王者归来》&lt;br /&gt;然后基本上啥也没干，仔细的看了一个多星期，看不明白的就到园子里来找，园子里的宝贝真不少！（还压了个韵。。。）&lt;br /&gt;本文的例子输出使用如下方法，便于查看&lt;br /&gt;function dwn(s){&lt;br /&gt;&amp;nbsp;document.write(s+"&amp;lt;br/&amp;gt;");&lt;br /&gt;}&lt;br /&gt;以下内容有些是原创，有些来自于网络，或者可以看成是读书笔记，如果有哪里不对的，请各位不吝赐教，在下感激不尽&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;em&gt;正文开始&lt;/em&gt;：&lt;br /&gt;&lt;strong&gt;一，function&lt;/strong&gt;&lt;br /&gt;从一开始接触到js就感觉好灵活，每个人的写法都不一样，比如一个function就有N种写法&lt;br /&gt;如：function showMsg(){}，var showMsg=function(){}，showMsg=function(){}&lt;br /&gt;似乎没有什么区别，都是一样的嘛，真的是一样的吗，大家看看下面的例子&lt;br /&gt;///------------------------------------------------------------------------------------------------&lt;br /&gt;//函数定义：命名函数（声明式），匿名函数（引用式）&lt;br /&gt;//声明式，定义代码先于函数执行代码被解析&lt;br /&gt;function t1(){&lt;br /&gt;&amp;nbsp;dwn("t1");&lt;br /&gt;}&lt;br /&gt;t1();&lt;br /&gt;function t1(){&lt;br /&gt;&amp;nbsp;dwn("new t1");&lt;br /&gt;}&lt;br /&gt;t1();&lt;br /&gt;//引用式，在函数运行中进行动态解析&lt;br /&gt;var t1=function(){&lt;br /&gt;&amp;nbsp;dwn("new new t1");&lt;br /&gt;}&lt;br /&gt;t1();&lt;br /&gt;var t1=function(){&lt;br /&gt;&amp;nbsp;dwn("new new new t1");&lt;br /&gt;}&lt;br /&gt;t1();&lt;br /&gt;//以上输出：new t1,new t1,new new t1,new new new t1&lt;br /&gt;可能想着应该是输出t1,new t1,new newt1,new new new t1，结果却并不是这样，应该理解这句话：声明式，定义代码先于函数执行代码被解析&lt;br /&gt;如果深入一步，应该说是scope链问题，实际上前面两个方法等价于window.t1，可以理解为t1是window的一个公有属性，被赋了两次值，以最后一次赋值为最终值&lt;br /&gt;而后面两个方法，可以理解为是t1是个变量，第四个方法的var去掉之后的结果仍然不会改变&lt;br /&gt;然而，当第四个方法改成function t1(){}这样的声明式时，结果变成了new new new t1,new new new t1,new new t1,new new t1&lt;br /&gt;前面两个按照我的理解可以很好的理解为什么是这个答案，第三个也可以理解，但是最后一个输出让我比较纠结，希望有高手出现解答一下&lt;br /&gt;另外匿名函数还有(function(){...})()这样的写法，最后一个括号用于参数输入&lt;br /&gt;还有var t1=new function(){..}这样的声明，实际上t1已经是一个对象了&lt;br /&gt;例：&lt;br /&gt;var t2 = new function()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var temp = 100;&amp;nbsp;//私有成员&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.temp = 200;&amp;nbsp;//公有成员，这两个概念会在第三点以后展开说明&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return temp + this.temp;&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;alert(typeof(t2));&amp;nbsp;&amp;nbsp;&amp;nbsp;//object&lt;br /&gt;alert(t2.constructor());&amp;nbsp;&amp;nbsp;//300&lt;br /&gt;除此之外，还有使用系统内置函数对象来构建一个函数，例：&lt;br /&gt;var t3 = new Function('var temp = 100; this.temp = 200; return temp + this.temp;');&amp;nbsp;//这个位置加不加new结果都一样，WHY&lt;br /&gt;alert(typeof(t3));&amp;nbsp;//function&lt;br /&gt;alert(t3());&amp;nbsp;&amp;nbsp;//300&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;二，创建对象&lt;/strong&gt;&lt;br /&gt;首先我们理解一下面向对象编程（Object-Oriented Programming,OOP），使用OOP技术，常常要使用许多代码模块，每个模块都提供特定的功能，每个模块都是孤立的，甚至与其它模块完全独立&lt;br /&gt;。这种模块化编程方法提供了非常大的多样性，大大增加了代码的重用机会。可以举例进一步说明这个问题，假定计算机上的一个高性能应用程序是一辆一流赛车。如果使用传统的编程技巧，这辆赛车就是&lt;br /&gt;一个单元。如果要改进该车，就必须替换整个单元，把它送回厂商，让汽车专家升级它，或者购买一个新车。如果使用OOP技术，就只需从厂商处购买新的引擎，自己按照说明替换它，而不必用钢锯切割车体。&lt;br /&gt;不过大部分的论点是，javascript并不是直接的面向对象的语言，但是通过模拟可以做到很多面向对象语言才能做到的事，如继承，多态，封装，javascript都能干（没有做不到，只是想不到）&lt;br /&gt;///------------------------------------------------------------------------------------------------&lt;br /&gt;//以下三种构造对象的方法&lt;br /&gt;//new Object，实例化一个Object&lt;br /&gt;var a=new Object();&lt;br /&gt;a.x=1,a.y=2;&lt;br /&gt;//对象直接量&lt;br /&gt;var b={x:1,y:2};&lt;br /&gt;//定义类型&lt;br /&gt;function Point(x,y){&amp;nbsp;//类似于C#中的类&lt;br /&gt;&amp;nbsp;this.x=x;&lt;br /&gt;&amp;nbsp;this.y=y;&lt;br /&gt;}&lt;br /&gt;var p=new Point(1,2);&amp;nbsp;//实例化类&lt;br /&gt;第一种方法通过构造基本对象直接添加属性的方法来实现，第二种和第一种差不多，可以看成是第一种方法的快捷表示法&lt;br /&gt;第三种方法中，可以以&amp;rdquo;类&amp;ldquo;为基础，创造多个类型相同的对象&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;三，对象属性的封装（公有和私有）&lt;/strong&gt;&lt;br /&gt;以例子来说明&lt;br /&gt;function List(){&lt;br /&gt;&amp;nbsp;var m_elements=[];&amp;nbsp;//私有成员，在对象外无法访问，如果此处无var声明，则m_elements将变成全局变量，这样外部是可以直接访问到的，如alert(m_elements[0])&lt;br /&gt;&amp;nbsp;m_elements=Array.apply(m_elements,arguments);&lt;br /&gt;&amp;nbsp;//此处模拟getter，使用时alist.length;&lt;br /&gt;&amp;nbsp;//等价于getName()方式：this.length=function(){return m_elements.length;}，使用时alist.length();&lt;br /&gt;&amp;nbsp;//公有属性，可以通过"."运算符或下标来访问&lt;br /&gt;&amp;nbsp;this.length={&lt;br /&gt;&amp;nbsp;&amp;nbsp;valueOf:function(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return m_elements.length;&lt;br /&gt;&amp;nbsp;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;toString:function(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return m_elements.length;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;//公有方法，此方法使用得alert(alist)相当于alert(alist.toString())&lt;br /&gt;&amp;nbsp;this.toString=function(){&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;return m_elements.toString();&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;//公有方法&lt;br /&gt;&amp;nbsp;this.add=function(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;m_elements.push.apply(m_elements,arguments);&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;//私有方法如下形式，这里涉及到了闭包的概念，接下来继续说明&lt;br /&gt;&amp;nbsp;//var add=function()或function add()&lt;br /&gt;&amp;nbsp;//{&lt;br /&gt;&amp;nbsp;//m_elements.push.apply(m_elements,arguments);&lt;br /&gt;&amp;nbsp;//}&lt;br /&gt;}&lt;br /&gt;var alist=new List(1,2,3);&lt;br /&gt;dwn(alist);&amp;nbsp; //=alert(alist.toString())，输出1,2,3&lt;br /&gt;dwn(alist.length);&amp;nbsp;//输出3&lt;br /&gt;alist.add(4,5,6);&amp;nbsp;&lt;br /&gt;dwn(alist);&amp;nbsp; //输出1,2,3,4,5,6&lt;br /&gt;dwn(alist.length);&amp;nbsp;//输出6&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;四，属性和方法的类型&lt;/strong&gt;&lt;br /&gt;javascript里，对象的属性和方法支持4种不同的类型：private property(私有属性)，dynamic public property(动态公有属性)，static public property/prototype property(静态公有属性或原型属性)，&lt;br /&gt;static property(静态属性或类属性)。私有属性对外界完全不具备访问性，可以通过内部的getter和setter（都是模拟）；动态公有属性外界可以访问，每个对象实例持有一个副本，不会相互影响；原型&lt;br /&gt;属性每个对象实例共享唯一副本；类属性不作为实例的属性，只作为类的属性。&lt;br /&gt;以下是例子：&lt;br /&gt;///------------------------------------------------------------------------------------------------&lt;br /&gt;//动态公有类型，静态公有类型（原型属性）&lt;br /&gt;function myClass(){&lt;br /&gt;&amp;nbsp;var p=100;&amp;nbsp;//private property&lt;br /&gt;&amp;nbsp;this.x=10;&amp;nbsp;&amp;nbsp;//dynamic public property&lt;br /&gt;}&lt;br /&gt;myClass.prototype.y=20;&amp;nbsp;//static public property or prototype property，动态为myClass的原型添加了属性，将作用于所有实例化了的对象，注意这里用到了prototype，这是一个非常有用的东东&lt;br /&gt;//要想成为高级javascript阶段，prototype和闭包必须得理解和适当应用&lt;br /&gt;myClass.z=30;&amp;nbsp;//static property&lt;/p&gt;&lt;p&gt;var a=new myClass();&lt;br /&gt;dwn(a.p)&amp;nbsp;//undefined&lt;br /&gt;dwn(a.x)&amp;nbsp;//10&lt;br /&gt;dwn(a.y)&amp;nbsp;//20&lt;br /&gt;a.x=20;&lt;br /&gt;a.y=40;&lt;br /&gt;dwn(a.x);&amp;nbsp;//20&lt;br /&gt;dwn(a.y);&amp;nbsp;//40&lt;br /&gt;delete(a.x);&amp;nbsp;//删除对象a的属性x&lt;br /&gt;delete(a.y);&amp;nbsp;//删除对象a的属性y&lt;br /&gt;dwn(a.x);&amp;nbsp;//undefined&lt;br /&gt;dwn(a.y);&amp;nbsp;//20&amp;nbsp;静态公有属性y被删除后还原为原型属性y&lt;br /&gt;dwn(a.z);&amp;nbsp;//undefined 类属性无法通过对象访问&lt;br /&gt;dwn(myClass.z);&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;五，原型（prototype）&lt;/strong&gt;&lt;br /&gt;这里只讲部分，prototype和闭包都不是几句话都能讲清楚的，如果这里可以给你一些启蒙，则万幸矣&lt;br /&gt;习语&amp;rdquo;照猫画虎&amp;ldquo;，这里的猫就是原型，虎是类型，可以表示成：虎.prototype=某只猫 or 虎.prototype=new 猫()&lt;br /&gt;因为原型属性每个对象实例共享唯一副本，所以当实例中的一个调整了一个原型属性的值时，所有实例调用这个属性时都将发生变化，这点需要注意&lt;br /&gt;以下是原型关系的类型链：&lt;br /&gt;function ClassA(){&lt;br /&gt;}&lt;br /&gt;ClassA.prototype=new Object();&lt;br /&gt;function ClassB(){&lt;br /&gt;}&lt;br /&gt;ClassB.prototype=new ClassA();&lt;br /&gt;function ClassC(){&lt;br /&gt;}&lt;br /&gt;ClassC.prototype=new ClassB();&lt;br /&gt;var obj=new ClassC();&lt;br /&gt;dwn(obj instanceof ClassC);&amp;nbsp;//true&lt;br /&gt;dwn(obj instanceof ClassB);&amp;nbsp;//true&lt;br /&gt;dwn(obj instanceof ClassA);&amp;nbsp;//true&lt;br /&gt;dwn(obj instanceof Object);&amp;nbsp;//true&lt;br /&gt;带默认值的Point对象：&lt;br /&gt;function Point2(x,y){&lt;br /&gt;&amp;nbsp;if (x) this.x=x;&lt;br /&gt;&amp;nbsp;if (y) this.y=y;&lt;br /&gt;}&lt;br /&gt;//设定Point2对象的x,y默认值为0&lt;br /&gt;Point2.prototype.x=0;&lt;br /&gt;Point2.prototype.y=0;&lt;br /&gt;//p1是一个默认(0,0)的对象&lt;br /&gt;var p1=new Point2();&amp;nbsp;//可以写成var p1=new Point2也不会出错，WHY&lt;br /&gt;//p2赋值&lt;br /&gt;var p2=new Point2(1,2);&lt;br /&gt;dwn(p1.x+","+p1.y);&amp;nbsp;//0,0&lt;br /&gt;dwn(p2.x+","+p2.y);&amp;nbsp;//1,2&lt;br /&gt;delete对象的属性后，原型属性将回到初始化的状态：&lt;br /&gt;function ClassD(){&lt;br /&gt;&amp;nbsp;this.a=100;&lt;br /&gt;&amp;nbsp;this.b=200;&lt;br /&gt;&amp;nbsp;this.c=300&lt;br /&gt;}&lt;br /&gt;ClassD.prototype=new ClassD();&amp;nbsp;//将ClassD原有的属性设为原型，包括其值&lt;br /&gt;ClassD.prototype.reset=function(){&amp;nbsp;//将非原型属性删除&lt;br /&gt;&amp;nbsp;for (var each in this) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;delete this[each];&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;var d=new ClassD();&lt;br /&gt;dwn(d.a);&amp;nbsp;//100&lt;br /&gt;d.a*=2;&lt;br /&gt;d.b*=2;&lt;br /&gt;d.c*=2;&lt;br /&gt;dwn(d.a);&amp;nbsp;//200&lt;br /&gt;dwn(d.b);&amp;nbsp;//400&lt;br /&gt;dwn(d.c);&amp;nbsp;//600&lt;br /&gt;d.reset();&amp;nbsp;//删掉非原型属性，所有回来原型&lt;br /&gt;dwn(d.a);&amp;nbsp;//100&lt;br /&gt;dwn(d.b);&amp;nbsp;//200&lt;br /&gt;dwn(d.c);&amp;nbsp;//300&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;六，继承&lt;/strong&gt;&lt;br /&gt;如果两个类都是同一个实例的类型，那么它们之间存在着某种关系，我们把同一个实例的类型之间的泛化关系称为继承。C#和JAVA中都有这个，具体的理解就不说了。&lt;br /&gt;在javascript中，并不直接从方法上支持继承，但是就像前面说的，可以模拟啊&lt;br /&gt;方法可以归纳为四种：构造继承法，原型继承法，实例继承法和拷贝继承法。融会贯通之后，还有混合继续法，这是什么法，就是前面四种挑几种混着来~&lt;br /&gt;以下例子来源于王者归来，其中涉及到了apply,call和一些Array的用法，有兴趣的可以自己在园子里搜索一下&lt;br /&gt;&lt;strong&gt;1，构造继续法例子：&lt;/strong&gt;&lt;br /&gt;//定义一个Collection类型&lt;br /&gt;&amp;nbsp;function Collection(size)&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;this.size = function(){return size};&amp;nbsp; //公有方法，可以被继承&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;Collection.prototype.isEmpty = function(){&amp;nbsp;&amp;nbsp; //静态方法，不能被继承&lt;br /&gt;&amp;nbsp;&amp;nbsp;return this.size() == 0;&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;//定义一个ArrayList类型，它"继承"Collection类型&lt;br /&gt;&amp;nbsp;function ArrayList()&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;var m_elements = []; //私有成员，不能被继承&lt;br /&gt;&amp;nbsp;&amp;nbsp;m_elements = Array.apply(m_elements, arguments);&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;//ArrayList类型继承Collection&lt;br /&gt;&amp;nbsp;&amp;nbsp;this.base = Collection;&lt;br /&gt;&amp;nbsp;&amp;nbsp;this.base.call(this, m_elements.length);&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;this.add = function()&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return m_elements.push.apply(m_elements, arguments);&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;this.toArray = function()&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return m_elements;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;}&lt;/p&gt;&lt;p&gt;&amp;nbsp;ArrayList.prototype.toString = function()&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;return this.toArray().toString();&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;//定义一个SortedList类型，它继承ArrayList类型&lt;br /&gt;&amp;nbsp;function SortedList()&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;//SortedList类型继承ArrayList&lt;br /&gt;&amp;nbsp;&amp;nbsp;this.base = ArrayList;&lt;br /&gt;&amp;nbsp;&amp;nbsp;this.base.apply(this, arguments);&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;this.sort = function()&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;var arr = this.toArray();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;arr.sort.apply(arr, arguments);&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;}&lt;/p&gt;&lt;p&gt;//构造一个ArrayList&lt;br /&gt;&amp;nbsp;var a = new ArrayList(1,2,3);&lt;br /&gt;&amp;nbsp;dwn(a);&lt;br /&gt;&amp;nbsp;dwn(a.size()); //a从Collection继承了size()方法&lt;br /&gt;&amp;nbsp;dwn(a.isEmpty);&amp;nbsp;//但是a没有继承到isEmpty()方法&lt;/p&gt;&lt;p&gt;&amp;nbsp;//构造一个SortedList&lt;br /&gt;&amp;nbsp;var b = new SortedList(3,1,2);&lt;br /&gt;&amp;nbsp;b.add(4,0);&amp;nbsp;//b 从ArrayList继承了add()方法&lt;br /&gt;&amp;nbsp;dwn(b.toArray());&amp;nbsp;//b 从ArrayList继承了toArray()方法&lt;br /&gt;&amp;nbsp;b.sort();&amp;nbsp;&amp;nbsp;//b 自己实现的sort()方法&lt;br /&gt;&amp;nbsp;dwn(b.toArray());&lt;br /&gt;&amp;nbsp;dwn(b);&lt;br /&gt;&amp;nbsp;dwn(b.size());&amp;nbsp;//b从Collection继承了size()方法&lt;br /&gt;&lt;strong&gt;2，原型继承法例子：&lt;/strong&gt;&lt;br /&gt;//定义一个Point类型&lt;br /&gt;&amp;nbsp;function Point(dimension)&lt;br /&gt;&amp;nbsp;{&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;this.dimension = dimension;&lt;br /&gt;&amp;nbsp;}&lt;/p&gt;&lt;p&gt;&amp;nbsp;//定义一个Point2D类型，"继承"Point类型&lt;br /&gt;&amp;nbsp;function Point2D(x, y)&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;this.x = x;&lt;br /&gt;&amp;nbsp;&amp;nbsp;this.y = y;&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;Point2D.prototype.distance = function()&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;return Math.sqrt(this.x * this.x + this.y * this.y);&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;Point2D.prototype = new Point(2);&amp;nbsp;&amp;nbsp;//Point2D继承了Point&lt;/p&gt;&lt;p&gt;&amp;nbsp;//定义一个Point3D类型，也继承Point类型&lt;br /&gt;&amp;nbsp;function Point3D(x, y, z)&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;this.x = x;&lt;br /&gt;&amp;nbsp;&amp;nbsp;this.y = y;&lt;br /&gt;&amp;nbsp;&amp;nbsp;this.z = z;&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;Point3D.prototype = new Point(3);&amp;nbsp;&amp;nbsp;//Point3D也继承了Point&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;//构造一个Point2D对象&lt;br /&gt;&amp;nbsp;var p1 = new Point2D(0,0);&lt;br /&gt;&amp;nbsp;//构造一个Point3D对象&lt;br /&gt;&amp;nbsp;var p2 = new Point3D(0,1,2);&lt;/p&gt;&lt;p&gt;&amp;nbsp;dwn(p1.dimension);&lt;br /&gt;&amp;nbsp;dwn(p2.dimension);&lt;br /&gt;&amp;nbsp;dwn(p1 instanceof Point2D);&amp;nbsp;//p1 是一个 Point2D&lt;br /&gt;&amp;nbsp;dwn(p1 instanceof Point);&amp;nbsp;//p1 也是一个 Point&lt;br /&gt;&amp;nbsp;dwn(p2 instanceof Point);&amp;nbsp;//p2 是一个Point&lt;br /&gt;以上两种方法是最常用的&lt;br /&gt;&lt;strong&gt;3，实例继承法例子：&lt;/strong&gt;&lt;br /&gt;在说此法例子之前，说说构造继承法的局限，如下：&lt;br /&gt;function MyDate()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;this.base = Date;&lt;br /&gt;&amp;nbsp;this.base.apply(this, arguments);&lt;br /&gt;}&lt;br /&gt;var date = new MyDate();&lt;br /&gt;alert(date.toGMTString); //undefined，date并没有继承到Date类型，所以没有toGMTString方法&lt;br /&gt;核心对象的某些方法不能被构造继承，原因是核心对象并不像我们自定义的一般对象那样在构造函数里进行赋值或初始化操作&lt;br /&gt;换成原型继承法呢？，如下：&lt;br /&gt;function MyDate(){}&lt;br /&gt;MyDate.prototype=new Date();&lt;br /&gt;var date=new MyDate();&lt;br /&gt;alert(date.toGMTString);&amp;nbsp;//'[object]'不是日期对象，仍然没有继承到Date类型！&lt;br /&gt;现在，换成实例继承法：&lt;br /&gt;function MyDate()&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;var instance = new Date();&amp;nbsp;//instance是一个新创建的日期对象&lt;br /&gt;&amp;nbsp;&amp;nbsp;instance.printDate = function(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;document.write("&amp;lt;p&amp;gt; "+instance.toLocaleString()+"&amp;lt;/p&amp;gt; ");&lt;br /&gt;&amp;nbsp;&amp;nbsp;} //对instance扩展printDate()方法&lt;br /&gt;&amp;nbsp;&amp;nbsp;return instance;&amp;nbsp; //将instance作为构造函数的返回值返回&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;var myDate = new MyDate();&lt;br /&gt;&amp;nbsp;dwn(myDate.toGMTString());&amp;nbsp;//这回成功输出了正确的时间字符串，看来myDate已经是一个Date的实例了，继承成功&lt;br /&gt;&amp;nbsp;myDate.printDate();&amp;nbsp;//如果没有return instance，将不能以下标访问，因为是私有对象的方法&lt;br /&gt;&lt;strong&gt;4，拷贝继承法例子：&lt;/strong&gt;&lt;br /&gt;Function.prototype.extends = function(obj)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;for(var each in obj)&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;this.prototype[each] = obj[each];&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;//对对象的属性进行一对一的复制，但是它又慢又容易引起问题&lt;br /&gt;&amp;nbsp;&amp;nbsp;//所以这种&amp;ldquo;继承&amp;rdquo;方式一般不推荐使用&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;var Point2D = function(){&lt;br /&gt;&amp;nbsp;//&amp;hellip;&amp;hellip;&lt;br /&gt;}&lt;br /&gt;Point2D.extends(new Point())&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;//&amp;hellip;&amp;hellip;&lt;br /&gt;}&lt;br /&gt;这种继承法似乎是用得很少的。&lt;br /&gt;&lt;strong&gt;5，混合继承例子：&lt;/strong&gt;&lt;br /&gt;function Point2D(x, y)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;this.x = x;&lt;br /&gt;&amp;nbsp;this.y = y;&lt;br /&gt;}&lt;br /&gt;function ColorPoint2D(x, y, c)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;Point2D.call(this, x, y);&amp;nbsp;//这里是构造继承，调用了父类的构造函数&lt;br /&gt;&amp;nbsp;//从前面的例子看过来，这里等价于&lt;br /&gt;&amp;nbsp;//this.base=Point2D;&lt;br /&gt;&amp;nbsp;//this.base.call(this,x,y);&lt;br /&gt;&amp;nbsp;this.color = c;&lt;br /&gt;}&lt;br /&gt;ColorPoint2D.prototype = new Point2D();&amp;nbsp;&amp;nbsp;//这里用了原型继承，让ColorPoint2D以Point2D对象为原型&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;本来还想继续写闭包，不过写这个还真是很难，我也是废了好几个小时的力气才算勉强弄明白，推荐以下博文：&lt;br /&gt;&lt;a href="http://www.cnblogs.com/rubylouvre/archive/2009/07/24/1530074.html#1884486"&gt;http://www.cnblogs.com/rubylouvre/archive/2009/07/24/1530074.html#1884486&lt;/a&gt;&lt;/p&gt;&lt;p&gt;希望以上文章对读者有启发，如果有错误，请留言，如果觉得还不错，&lt;strong&gt;可以点击右下的推荐给更多的人&lt;/strong&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/bestfc/aggbug/1790173.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/bestfc/archive/2010/08/02/1790173.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/bestfc/archive/2010/07/06/1771935.html</id><title type="text">一步一步制作jquery插件Tabs（ajax只请求一次效果，78行完成）</title><summary type="text">tabs是现在网页应用最广的一种效果，jquery插件和非jquery插件也有不少，有一些朋友问我怎么用jquery.ui.tabs的ajax怎么只请求服务器一次原来我想其实很简单，看看官方的API就了解，不过我在回复这些朋友之前，用firebug查看了官方的ui.tabs发现，声明了ajax缓存，每点一个tabs时，仍然会有服务器请求这应该是服务器缓存，而不是实际上我们要求的只ajax一次，不再...</summary><published>2010-07-06T02:43:00Z</published><updated>2010-07-06T02:43:00Z</updated><author><name>黑曜石</name><uri>http://www.cnblogs.com/bestfc/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bestfc/archive/2010/07/06/1771935.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bestfc/archive/2010/07/06/1771935.html"/><content type="html">&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tabs是现在网页应用最广的一种效果，jquery插件和非jquery插件也有不少，有一些朋友问我怎么用jquery.ui.tabs的ajax怎么只请求服务器一次&lt;/p&gt;&lt;p&gt;原来我想其实很简单，看看官方的API就了解，不过我在回复这些朋友之前，用firebug查看了官方的ui.tabs发现，声明了ajax缓存，每点一个tabs时，仍然会有服务器请求&lt;/p&gt;&lt;p&gt;这应该是服务器缓存，而不是实际上我们要求的只ajax一次，不再请求服务器了&lt;/p&gt;&lt;p&gt;接下来我找了一下其它的tabs插件，基本上没有符合要求的，不是太庞大就是太简单，太过庞大的话不如用ui.tabs，文档和代码规范上都是可靠的&lt;/p&gt;&lt;p&gt;因此，自制一个简洁的tabs插件还是有必要的&lt;/p&gt;&lt;p&gt;在设计之前，先整理好思路，实现tabs，自动轮换，ajax等主要功能，然后是dom的排列形式，这里采用传统的&lt;/p&gt;&lt;p&gt;&amp;lt;div id="tabs"&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;ul&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;li&amp;gt;&amp;lt;a href="#tabs1"&amp;gt;tabs1&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;li&amp;gt;&amp;lt;a href="#tabs2" rel="ajax.htm"&amp;gt;tabs2&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;/ul&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;div id="tabs1"&amp;gt;Hello World!&amp;lt;/div&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;div id="tabs2"&amp;gt;&amp;lt;/div&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;/div&amp;gt;&lt;/p&gt;&lt;p&gt;一个li对应一个div的方式，当ajax时，添加一个a的rel属性，并将内容写入对应的div中，再去掉rel属性，这样就只请求服务器一次，接下来都是div已经写入的内容了&lt;/p&gt;&lt;p&gt;我这里没有使用cookie，可以结合jquery.cookie插件，这样即使用户关闭网页下次再打开，也不用请求服务器了&lt;/p&gt;&lt;p&gt;一，首先写个jquery插件的闭包，园子里这两天有个朋友写了javascript的闭包概念，挺好的，有兴趣的朋友去看看&lt;/p&gt;(function ($) {&lt;br/&gt;//code here&lt;br/&gt;})(jQuery);&lt;p&gt;二，插件命名，这里命名为aTabs，这样绑定的时候可以用$(...).aTabs()，本人英文名Allen，所以用a字头命名了~&lt;/p&gt;$.fn.aTabs = function (options) {&lt;br/&gt;//api&lt;br/&gt;//main function&lt;br/&gt;}&lt;p&gt;三，把想好的功能写成API，供外部修改&lt;/p&gt;$.fn.aTabs.defaults = {&lt;br/&gt;            firstOn: 0,&lt;br/&gt;            className: 'selected',&lt;br/&gt;            eventName: 'all',           //click,mouserover,all&lt;br/&gt;            loadName: '加载中...',     //ajax等待字符串&lt;br/&gt;        fadeIn: 'normal',&lt;br/&gt;            autoFade: false,&lt;br/&gt;            autoFadeTime: 3&lt;br/&gt;        };&lt;br/&gt;var opts = $.extend({}, $.fn.aTabs.defaults, options); //这里可以将外部输入的代替掉默认的值，$.extend作用详见 &lt;a href="http://api.jquery.com/jQuery.extend/"&gt;http://api.jquery.com/jQuery.extend/&lt;/a&gt;，看不懂英文的直接看其中的例子就行&lt;p&gt;四，编写主体功能，说明在代码中看注释&lt;/p&gt;return this.each(function () { //这里为每个绑定dom插件&lt;br/&gt;            var target = $(this);&lt;br/&gt;            var div = target.children().not("ul,span");  //所有的tabs显示体div&lt;br/&gt;            var tabs = target.find('ul:eq(0) li');   //所有的tabs头部索引&lt;br/&gt;            function Tabs() {&lt;br/&gt;                if ($(this).hasClass(opts.className)) {&lt;br/&gt;                    return false;&lt;br/&gt;                }&lt;br/&gt;                tabsShow(div, $(this));&lt;br/&gt;                return false;&lt;br/&gt;            }&lt;br/&gt;&lt;br/&gt;            function tabsShow(div, li, index) {&lt;br/&gt;                div.stop(true, true).hide();&lt;br/&gt;                //自动轮换用&lt;br/&gt;                if (typeof (index) == "number") {&lt;br/&gt;                    if (li.find("a").attr("rel")) ajax(div, li);&lt;br/&gt;                    $(div[index]).stop(true,true).fadeIn(opts.fadeIn);&lt;br/&gt;                    tabs.stop(true, true).removeClass(opts.className);&lt;br/&gt;                    $(tabs[index]).stop(true, true).addClass(opts.className);&lt;br/&gt;                }&lt;br/&gt;                //非自动轮换&lt;br/&gt;                else {&lt;br/&gt;                    var tabBody = div.filter(li.find("a").attr("href"));&lt;br/&gt;                    if (li.find("a").attr("rel")) ajax(div, li);&lt;br/&gt;                    tabBody.stop(true,true).fadeIn(opts.fadeIn);&lt;br/&gt;                    tabs.stop(true, true).removeClass(opts.className);&lt;br/&gt;                    li.stop(true, true).addClass(opts.className);&lt;br/&gt;                }&lt;br/&gt;            }&lt;br/&gt;&lt;br/&gt;            function ajax(div, li) {//这里是关键ajax，通过操作rel的方式实现只请求服务器一次&lt;br/&gt;                var href = li.find("a").attr("href");&lt;br/&gt;                var rel = li.find("a").attr("rel");     //ajax请求url&lt;br/&gt;                var i = div.filter(href);                 //当前div&lt;br/&gt;                if (rel) {                                      //如果ajax请求url不为空，只ajax一次&lt;br/&gt;                    i.html(opts.loadName);&lt;br/&gt;                    $.ajax({&lt;br/&gt;                        url: rel,&lt;br/&gt;                        cache: false,&lt;br/&gt;                        success: function (html) {&lt;br/&gt;                            i.html(html);&lt;br/&gt;                        },&lt;br/&gt;                        error: function () {&lt;br/&gt;                            i.html('加载错误，请重试！');&lt;br/&gt;                        }&lt;br/&gt;                    });&lt;br/&gt;                    li.find("a").removeAttr("rel");  //只ajax一次&lt;br/&gt;                }&lt;br/&gt;            }&lt;br/&gt;            if (opts.autoFade) {&lt;br/&gt;                var index = opts.firstOn + 1;&lt;br/&gt;                setInterval(function () {&lt;br/&gt;                    if (index &amp;gt;= div.length) {&lt;br/&gt;                        index = 0;&lt;br/&gt;                    }&lt;br/&gt;                    tabsShow(div, $(this), index++);&lt;br/&gt;                }, opts.autoFadeTime * 1000);&lt;br/&gt;            }&lt;br/&gt;&lt;br/&gt;            tabs.bind(opts.eventName == 'all' ? 'click mouseover' : opts.eventName, Tabs)   //绑定事件&lt;br/&gt;                .filter(':first').trigger(opts.eventName == 'all' ? 'click' : opts.eventName);          //自动触发事件&lt;br/&gt;        });&lt;br/&gt;&lt;p&gt;最后，将以上整合，tabs插件就诞生了，下面是全部源码：&lt;/p&gt;/*&lt;br/&gt;* 作者：黑曜石&lt;br/&gt;*/&lt;br/&gt;(function ($) {&lt;br/&gt;    $.fn.aTabs = function (options) {&lt;br/&gt;        $.fn.aTabs.defaults = {&lt;br/&gt;            firstOn: 0,&lt;br/&gt;            className: 'selected',&lt;br/&gt;            eventName: 'all',           //click,mouserover,all&lt;br/&gt;            loadName: '加载中...',     //ajax等待字符串&lt;br/&gt;            fadeIn: 'normal',&lt;br/&gt;            autoFade: false,&lt;br/&gt;            autoFadeTime: 3&lt;br/&gt;        };&lt;br/&gt;        var opts = $.extend({}, $.fn.aTabs.defaults, options);&lt;br/&gt;&lt;br/&gt;        return this.each(function () {&lt;br/&gt;            var target = $(this);&lt;br/&gt;            var div = target.children().not("ul,span");  //所有的tabs显示体div&lt;br/&gt;            var tabs = target.find('ul:eq(0) li');   //所有的tabs头部索引&lt;br/&gt;            function Tabs() {&lt;br/&gt;                if ($(this).hasClass(opts.className)) {&lt;br/&gt;                    return false;&lt;br/&gt;                }&lt;br/&gt;                tabsShow(div, $(this));&lt;br/&gt;                return false;&lt;br/&gt;            }&lt;br/&gt;&lt;br/&gt;            function tabsShow(div, li, index) {&lt;br/&gt;                div.stop(true, true).hide();&lt;br/&gt;                //自动轮换用&lt;br/&gt;                if (typeof (index) == "number") {&lt;br/&gt;                    if (li.find("a").attr("rel")) ajax(div, li);&lt;br/&gt;                    $(div[index]).stop(true,true).fadeIn(opts.fadeIn);&lt;br/&gt;                    tabs.stop(true, true).removeClass(opts.className);&lt;br/&gt;                    $(tabs[index]).stop(true, true).addClass(opts.className);&lt;br/&gt;                }&lt;br/&gt;                //非自动轮换&lt;br/&gt;                else {&lt;br/&gt;                    var tabBody = div.filter(li.find("a").attr("href"));&lt;br/&gt;                    if (li.find("a").attr("rel")) ajax(div, li);&lt;br/&gt;                    tabBody.stop(true,true).fadeIn(opts.fadeIn);&lt;br/&gt;                    tabs.stop(true, true).removeClass(opts.className);&lt;br/&gt;                    li.stop(true, true).addClass(opts.className);&lt;br/&gt;                }&lt;br/&gt;            }&lt;br/&gt;&lt;br/&gt;            function ajax(div, li) {&lt;br/&gt;                var href = li.find("a").attr("href");&lt;br/&gt;                var rel = li.find("a").attr("rel");     //ajax请求url&lt;br/&gt;                var i = div.filter(href);                 //当前div&lt;br/&gt;                if (rel) {                                      //如果ajax请求url不为空，只ajax一次&lt;br/&gt;                    i.html(opts.loadName);&lt;br/&gt;                    $.ajax({&lt;br/&gt;                        url: rel,&lt;br/&gt;                        cache: false,&lt;br/&gt;                        success: function (html) {&lt;br/&gt;                            i.html(html);&lt;br/&gt;                        },&lt;br/&gt;                        error: function () {&lt;br/&gt;                            i.html('加载错误，请重试！');&lt;br/&gt;                        }&lt;br/&gt;                    });&lt;br/&gt;                    li.find("a").removeAttr("rel");  //只ajax一次&lt;br/&gt;                }&lt;br/&gt;            }&lt;br/&gt;            if (opts.autoFade) {&lt;br/&gt;                var index = opts.firstOn + 1;&lt;br/&gt;                setInterval(function () {&lt;br/&gt;                    if (index &amp;gt;= div.length) {&lt;br/&gt;                        index = 0;&lt;br/&gt;                    }&lt;br/&gt;                    tabsShow(div, $(this), index++);&lt;br/&gt;                }, opts.autoFadeTime * 1000);&lt;br/&gt;            }&lt;br/&gt;&lt;br/&gt;            tabs.bind(opts.eventName == 'all' ? 'click mouseover' : opts.eventName, Tabs)   //绑定事件&lt;br/&gt;                .filter(':first').trigger(opts.eventName == 'all' ? 'click' : opts.eventName);          //自动触发事件&lt;br/&gt;        });&lt;br/&gt;    };&lt;br/&gt;})(jQuery);&lt;br/&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/bestfc/aggbug/1771935.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/bestfc/archive/2010/07/06/1771935.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/bestfc/archive/2010/06/09/1754655.html</id><title type="text">封装jQuery表格插件jqGrid，控件化jqGrid(三）：查询，编辑，修改，删除</title><summary type="text">上两篇：封装jQuery表格插件jqGrid，控件化jqGrid（一）：显示封装jQuery表格插件jqGrid，控件化jqGrid（二）：显示本文将编码表格的动作功能，查询，编辑，修改和删除，并在文末附上源码，供大家参考，一起讨论，希望可以抛砖引玉！一，在jqGrid.cs控件主体类中加入属性，用于控制这些功能的开关相应的，需要在构造jqGrid页面JS时，构造相应的JS脚本，代码大家自己下源码...</summary><published>2010-06-09T04:43:00Z</published><updated>2010-06-09T04:43:00Z</updated><author><name>黑曜石</name><uri>http://www.cnblogs.com/bestfc/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bestfc/archive/2010/06/09/1754655.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bestfc/archive/2010/06/09/1754655.html"/><content type="html">&lt;p&gt;上两篇：&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/bestfc/archive/2010/06/07/1753216.html"&gt;封装jQuery表格插件jqGrid，控件化jqGrid（一）：显示&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/bestfc/archive/2010/06/08/1753685.html"&gt;封装jQuery表格插件jqGrid，控件化jqGrid（二）：显示&lt;/a&gt;&lt;/p&gt;&lt;p&gt;本文将编码表格的动作功能，查询，编辑，修改和删除，并在文末附上源码，供大家参考，一起讨论，希望可以抛砖引玉！&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;一，在jqGrid.cs控件主体类中加入属性，用于控制这些功能的开关&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;#region 动作按钮&lt;br/&gt;        private bool _search = false;&lt;br/&gt;        private bool _add = false;&lt;br/&gt;        private bool _edit = false;&lt;br/&gt;        private bool _del = false;&lt;br/&gt;        [Description("是否可查询，默认否")]&lt;br/&gt;        public bool Search&lt;br/&gt;        {&lt;br/&gt;            get { return _search; }&lt;br/&gt;            set { _search = value; }&lt;br/&gt;        }&lt;br/&gt;        [Description("是否可添加，默认否")]&lt;br/&gt;        public bool Add&lt;br/&gt;        {&lt;br/&gt;            get { return _add; }&lt;br/&gt;            set { _add = value; }&lt;br/&gt;        }&lt;br/&gt;        [Description("是否可编辑，默认否")]&lt;br/&gt;        public bool Edit&lt;br/&gt;        {&lt;br/&gt;            get { return _edit; }&lt;br/&gt;            set { _edit = value; }&lt;br/&gt;        }&lt;br/&gt;        [Description("是否可删除，默认否")]&lt;br/&gt;        public bool Del&lt;br/&gt;        {&lt;br/&gt;            get { return _del; }&lt;br/&gt;            set { _del = value; }&lt;br/&gt;        }&lt;br/&gt;        #endregion&lt;br/&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;相应的，需要在构造jqGrid页面JS时，构造相应的JS脚本，代码大家自己下源码可以看到。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;二，做完了控件类，现在开始数据提供类的编码，这也是最核心的。&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1）查询&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;可以用firebug看到jqGrid查询时，使用的是get方式，所以用Request.QueryString的方式取得控件传过来的值&lt;/p&gt;&lt;p&gt;看到传来的的_search参数控件查询的开关，当值为true时，查询打开&lt;/p&gt;&lt;p&gt;本控件仅使用复合查询的方式，并且默认使用&amp;ldquo;包含&amp;rdquo;，&amp;ldquo;大于等于&amp;rdquo;和&amp;ldquo;小于等于&amp;rdquo;，前者符合大部分的通用查询的要求，后者使得查询处理更简单些&lt;/p&gt;&lt;p&gt;其形式如：{"groupOp":"AND","rules":[{"field":"email","op":"cn","data":"1"},{"field":"orderno","op":"ge","data":"2"}]}&lt;/p&gt;&lt;p&gt;使用复合查询时，传过来的查询值是以json的方式包含在filters参数中的，因此，要使用其值，需要对其值进行JSON的反序列化，这里使用DataContractJsonSerializer，需要在类中using System.Runtime.Serialization.Json，工程中也要加入其引用，其核心代码如下：&lt;/p&gt;//反序列化json&lt;br/&gt;                            string conditions = HttpUtility.UrlDecode(context.Request.QueryString["filters"].ToString());&lt;br/&gt;                            var mStream = new MemoryStream(Encoding.UTF8.GetBytes(conditions));     //解决中文乱码问题&lt;br/&gt;                            //var mStream = new MemoryStream(Encoding.Unicode.GetBytes(conditions));&lt;br/&gt;                            DataContractJsonSerializer dcjson = new DataContractJsonSerializer(typeof(jqGridFilter));&lt;br/&gt;                            jqGridFilter filters = (jqGridFilter)dcjson.ReadObject(mStream);&lt;br/&gt;                            //jqGridFilter filters = (jqGridFilter)dcjson.ReadObject(mStream);&lt;br/&gt;&lt;p&gt;另外，还需要新建一个类，用于对应反序列化&lt;/p&gt;[DataContract]&lt;br/&gt;    class jqGridFilter&lt;br/&gt;    {&lt;br/&gt;        //{"groupOp":"AND","rules":[{"field":"email","op":"cn","data":"1"},{"field":"orderno","op":"ge","data":"2"}]}&lt;br/&gt;        private string groupOp = "AND";&lt;br/&gt;        private List&amp;lt;jqGridFilterRules&amp;gt; jqGridFilterRulesList;&lt;br/&gt;        [DataMember(Name="groupOp")]&lt;br/&gt;        public string GroupOp&lt;br/&gt;        {&lt;br/&gt;            get { return groupOp; }&lt;br/&gt;            set { groupOp = value; }&lt;br/&gt;        }&lt;br/&gt;        [DataMember(Name = "rules")]&lt;br/&gt;        public List&amp;lt;jqGridFilterRules&amp;gt; JqGridFilterRulesList&lt;br/&gt;        {&lt;br/&gt;            get { return jqGridFilterRulesList; }&lt;br/&gt;            set { jqGridFilterRulesList = value; }&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    [DataContract]&lt;br/&gt;    class jqGridFilterRules&lt;br/&gt;    {&lt;br/&gt;        private string field;&lt;br/&gt;        private string op;&lt;br/&gt;        private string data;&lt;br/&gt;        [DataMember(Name = "field")]&lt;br/&gt;        public string Field&lt;br/&gt;        {&lt;br/&gt;            get { return field; }&lt;br/&gt;            set { field = value; }&lt;br/&gt;        }&lt;br/&gt;        [DataMember(Name = "op")]&lt;br/&gt;        public string Op&lt;br/&gt;        {&lt;br/&gt;            get { return op; }&lt;br/&gt;            set { op = value; }&lt;br/&gt;        }&lt;br/&gt;        [DataMember(Name = "data")]&lt;br/&gt;        public string Data&lt;br/&gt;        {&lt;br/&gt;            get { return data; }&lt;br/&gt;            set { data = value; }&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;&lt;p&gt;注意类名上的DataContract声明和参数中的形如[DataMember(Name="groupOp")]的声明，这是反序列化所必须的，具体的大家可以搜索一下，这里就不做详细说明了&lt;/p&gt;&lt;p&gt;以上就完成了查询条件方面的参数分析和清理，现在对这些东东进行数据库交互&lt;/p&gt;if (filters.GroupOp == "AND")&lt;br/&gt;                            {&lt;br/&gt;                                foreach(jqGridFilterRules rules in filters.JqGridFilterRulesList)&lt;br/&gt;                                {&lt;br/&gt;                                    switch (rules.Op)&lt;br/&gt;                                    {&lt;br/&gt;                                        case "cn":&lt;br/&gt;                                            searchCase += " and " + rules.Field + " like '%" + rules.Data + "%'";&lt;br/&gt;                                            break;&lt;br/&gt;                                        case "ge":&lt;br/&gt;                                            searchCase += " and " + rules.Field + "&amp;gt;='" + rules.Data + "'";&lt;br/&gt;                                            break;&lt;br/&gt;                                        case "le":&lt;br/&gt;                                            searchCase += " and " + rules.Field + "&amp;lt;='" + rules.Data + "'";&lt;br/&gt;                                            break;&lt;br/&gt;                                        default:&lt;br/&gt;                                            break;&lt;br/&gt;                                    }&lt;br/&gt;                                }&lt;br/&gt;                            }&lt;br/&gt;                            else&lt;br/&gt;                            {&lt;br/&gt;                                searchCase += " and (1&amp;lt;&amp;gt;1";&lt;br/&gt;                                foreach (jqGridFilterRules rules in filters.JqGridFilterRulesList)&lt;br/&gt;                                {&lt;br/&gt;                                    switch (rules.Op)&lt;br/&gt;                                    {&lt;br/&gt;                                        case "cn":&lt;br/&gt;                                            searchCase += " or " + rules.Field + " like '%" + rules.Data + "%'";&lt;br/&gt;                                            break;&lt;br/&gt;                                        case "ge":&lt;br/&gt;                                            searchCase += " or " + rules.Field + "&amp;gt;='" + rules.Data + "'";&lt;br/&gt;                                            break;&lt;br/&gt;                                        case "le":&lt;br/&gt;                                            searchCase += " or " + rules.Field + "&amp;lt;='" + rules.Data + "'";&lt;br/&gt;                                            break;&lt;br/&gt;                                        default:&lt;br/&gt;                                            break;&lt;br/&gt;                                    }&lt;br/&gt;                                }&lt;br/&gt;                                searchCase += ")";&lt;br/&gt;                            }&lt;br/&gt;&lt;p&gt;注意到or条件时，searchCase += " and (1&amp;lt;&amp;gt;1"这样的形式，这个小技巧，大家可以在sql中自己试试看，这样可以解决拼接SQL条件时or开头的问题，在第一篇中还有1=1的形式，同样的，也是可以解决and开头的问题。这个是我师傅教的，自认为是一个很牛比的小技巧。&lt;/p&gt;&lt;p&gt;查询至些就OVER了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2）编辑，删除，添加&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在设计控件之初，就为这个编辑伤脑筋，每个表的字段都不一样，类型也不一样，用反射吗，不灵活，也好麻烦，不能控件到细部&lt;/p&gt;&lt;p&gt;用entity framework吧，这个好，自动取到post过来的值，自动更新model，不过要依赖entity，更不通用。&lt;/p&gt;&lt;p&gt;后来想到配置用XML，问题一通百通，不管是表体的呈现灵活还是数据提供类的方面，都可以解决掉。&lt;/p&gt;&lt;p&gt;此三个功能都是使用post方式传递各项值，了解这点以后就很方便了，直接拼接SQL就可以完成这三个功能，很简单&lt;/p&gt;#region 添?加&amp;oacute;，?修T改?，?删?除y&lt;br/&gt;                    case "edit":&lt;br/&gt;                        string tableName = context.Request.QueryString["tablename"].ToString();&lt;br/&gt;                        string idKey = string.Empty;&lt;br/&gt;                        string oper = context.Request.Form["oper"].ToString();                        &lt;br/&gt;                        string xmlPath = System.AppDomain.CurrentDomain.BaseDirectory + tableName + ".xml";&lt;br/&gt;                        StringBuilder sb;&lt;br/&gt;                        XmlDocument xmlDoc = new XmlDocument();&lt;br/&gt;                        XmlNodeList xnList = xmlDoc.SelectNodes("root//columns");&lt;br/&gt;                        xmlDoc.Load(xmlPath);&lt;br/&gt;                        foreach (XmlNode xn in xnList)&lt;br/&gt;                        {&lt;br/&gt;                            if (xn.Attributes["IsIdentity"] != null)&lt;br/&gt;                            {&lt;br/&gt;                                idKey = xn.Attributes["name"].Value;&lt;br/&gt;                            }&lt;br/&gt;                        }&lt;br/&gt;&lt;br/&gt;                        switch (oper)&lt;br/&gt;                        {&lt;br/&gt;                            case "edit":&lt;br/&gt;                                sb = new StringBuilder();&lt;br/&gt;                                sb.Append("update " + tableName + " set ");&lt;br/&gt;                                foreach (XmlNode xn in xnList)&lt;br/&gt;                                {&lt;br/&gt;                                    if (xn.Attributes["IsIdentity"] == null || xn.Attributes["IsIdentity"].Value == "False")&lt;br/&gt;                                    {&lt;br/&gt;                                        if (context.Request.Form[xn.Attributes["name"].Value].ToString() != string.Empty)&lt;br/&gt;                                        {&lt;br/&gt;                                            if (xn.Attributes["sorttype"].Value == "int" || xn.Attributes["sorttype"].Value == "float")&lt;br/&gt;                                            {&lt;br/&gt;                                                sb.Append(xn.Attributes["name"].Value + "=" + HttpUtility.UrlDecode(context.Request.Form[xn.Attributes["name"].Value].ToString()) + ",");&lt;br/&gt;                                            }&lt;br/&gt;                                            else&lt;br/&gt;                                            {&lt;br/&gt;                                                sb.Append(xn.Attributes["name"].Value + "='" + HttpUtility.UrlDecode(context.Request.Form[xn.Attributes["name"].Value].ToString()) + "',");&lt;br/&gt;                                            }&lt;br/&gt;                                        }&lt;br/&gt;                                    }&lt;br/&gt;                                }&lt;br/&gt;                                sb.Remove(sb.Length - 1, 1);&lt;br/&gt;                                sb.Append(" where id=" + context.Request.Form[idKey].ToString());&lt;br/&gt;                                SqlHelper.ExecuteNonQuery(sb.ToString());&lt;br/&gt;                                break;&lt;br/&gt;                            case "add":&lt;br/&gt;                                sb = new StringBuilder();&lt;br/&gt;                                StringBuilder fieldstr = new StringBuilder();&lt;br/&gt;                                StringBuilder valuestr = new StringBuilder();&lt;br/&gt;                                foreach (XmlNode xn in xnList)&lt;br/&gt;                                {&lt;br/&gt;                                    if (xn.Attributes["IsIdentity"] == null || xn.Attributes["IsIdentity"].Value == "False")&lt;br/&gt;                                    {&lt;br/&gt;                                        if (context.Request.Form[xn.Attributes["name"].Value].ToString() != string.Empty)&lt;br/&gt;                                        {&lt;br/&gt;                                            fieldstr.Append(xn.Attributes["name"].Value + ",");&lt;br/&gt;                                            if (xn.Attributes["sorttype"].Value == "int" || xn.Attributes["sorttype"].Value == "float")&lt;br/&gt;                                            {&lt;br/&gt;                                                valuestr.Append(HttpUtility.UrlDecode(context.Request.Form[xn.Attributes["name"].Value].ToString()) + ",");&lt;br/&gt;                                            }&lt;br/&gt;                                            else&lt;br/&gt;                                            {&lt;br/&gt;                                                valuestr.Append("'" + HttpUtility.UrlDecode(context.Request.Form[xn.Attributes["name"].Value].ToString()) + "',");&lt;br/&gt;                                            }&lt;br/&gt;                                        }&lt;br/&gt;                                    }&lt;br/&gt;                                }&lt;br/&gt;                                fieldstr.Remove(fieldstr.Length - 1, 1);&lt;br/&gt;                                valuestr.Remove(valuestr.Length - 1, 1);&lt;br/&gt;                                sb.Append("insert into " + tableName + " (");&lt;br/&gt;                                sb.Append(fieldstr.ToString());                               &lt;br/&gt;                                sb.Append(") values (");&lt;br/&gt;                                sb.Append(valuestr.ToString());&lt;br/&gt;                                sb.Append(")");&lt;br/&gt;                                SqlHelper.ExecuteNonQuery(sb.ToString());&lt;br/&gt;                                break;&lt;br/&gt;                            case "del":&lt;br/&gt;                                string sql="delete from "+tableName+" where id="+context.Request.Form[idKey].ToString();&lt;br/&gt;                                SqlHelper.ExecuteNonQuery(sql);&lt;br/&gt;                                break;&lt;br/&gt;                            default:&lt;br/&gt;                                break;&lt;br/&gt;                        }&lt;br/&gt;                        #endregion&lt;br/&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;文章有点长了，本来再慢慢写的，不过这几天很忙，一次写完吧，还是那句话，希望可以抛砖引玉。&lt;/p&gt;&lt;p&gt;这里是源码下载：&lt;a href="http://files.cnblogs.com/bestfc/AspJqGrid.rar"&gt;http://files.cnblogs.com/bestfc/AspJqGrid.rar&lt;/a&gt;&lt;/p&gt;&lt;p&gt;使用方法：&lt;/p&gt;&lt;p&gt;web.config中加入&lt;/p&gt;&amp;lt;pages&amp;gt;&lt;br/&gt;        &amp;lt;controls&amp;gt;&lt;br/&gt;          &amp;lt;add tagPrefix="AllenJqGrid" assembly="AspJqGrid" namespace="AspJqGrid" /&amp;gt;&lt;br/&gt;        &amp;lt;/controls&amp;gt;&lt;br/&gt;      &amp;lt;/pages&amp;gt;&lt;br/&gt;      &amp;lt;httpHandlers&amp;gt;&lt;br/&gt;        &amp;lt;add path="data.ashx" verb="*" type="AspJqGrid.AjaxData,AspJqGrid"/&amp;gt;&lt;br/&gt;      &amp;lt;/httpHandlers&amp;gt;&lt;br/&gt;&lt;p&gt;页面中加入jquery.js和jquery.ui.css后，写入&lt;/p&gt;&lt;p&gt;&amp;lt;AllenJqGrid:JqGrid ID="MyJqGrid" runat="server" TableName="orders" Search="true" Scroll="true" Add="true" Edit="true" Del="true" /&amp;gt;，就OK了。&lt;/p&gt;&lt;p&gt;配置文件自动生成在页面文件所在目录，生成会判断是否有配置文件，有则读，无则生成后再读。&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/bestfc/aggbug/1754655.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/bestfc/archive/2010/06/09/1754655.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/bestfc/archive/2010/06/08/1753685.html</id><title type="text">封装jQuery表格插件jqGrid，控件化jqGrid（二）：显示</title><summary type="text">接上一篇http://www.cnblogs.com/bestfc/archive/2010/06/07/1753216.html本文编码数据提供类1，创建AjaxData类，继承接口IHttpHandler，实现其方法public void ProcessRequest(HttpContext context)和参数public bool IsReusable2，使用SqlHelper类与数据库...</summary><published>2010-06-08T01:09:00Z</published><updated>2010-06-08T01:09:00Z</updated><author><name>黑曜石</name><uri>http://www.cnblogs.com/bestfc/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bestfc/archive/2010/06/08/1753685.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bestfc/archive/2010/06/08/1753685.html"/><content type="html">&lt;p&gt;接上一篇&lt;a href="http://www.cnblogs.com/bestfc/archive/2010/06/07/1753216.html"&gt;http://www.cnblogs.com/bestfc/archive/2010/06/07/1753216.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;本文编码数据提供类&lt;/p&gt;&lt;p&gt;1，创建AjaxData类，继承接口IHttpHandler，实现其方法public void ProcessRequest(HttpContext context)和参数public bool IsReusable&lt;/p&gt;&lt;p&gt;2，使用SqlHelper类与数据库进行交互（在MVC中可以使用entity framework提供数据，当然在MVC中，最好就不要使用服务器控件了，可以直接输出字符串）&lt;/p&gt;&lt;p&gt;3，在AjaxData类中，创建两个方法&lt;/p&gt;&lt;p&gt;public string jsonString(HttpContext context)用于处理接收到的基本数据，最后经过以下方法返回数据的json字符串&lt;/p&gt;&lt;p&gt;其代码如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;img height="16" width="11" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_480611').style.display='none'; document.getElementById('Code_Open_Image_480611').style.display='inline'; document.getElementById('Code_Open_Text_480611').style.display='inline';" id="Code_Closed_Image_480611" /&gt;&lt;img height="16" width="11" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_480611').style.display='none'; getElementById('Code_Closed_Image_480611').style.display='inline'; getElementById('Code_Closed_Text_480611').style.display='inline';" id="Code_Open_Image_480611" style="display: none;" /&gt;&lt;span class="cnblogs_code_Collapse" id="Code_Closed_Text_480611"&gt;&amp;nbsp;&lt;/span&gt;&lt;span id="Code_Open_Text_480611" style="display: none;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; jsonString(HttpContext context)&lt;br/&gt;        {&lt;br/&gt;            &lt;span style="color: #008000;"&gt;//params from Request.QueryString&lt;/span&gt;&lt;br/&gt;            &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; tableName = context.Request.QueryString["&lt;span style="color: #8b0000;"&gt;tablename&lt;/span&gt;"].ToString();&lt;br/&gt;            &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; xmlPath = System.AppDomain.CurrentDomain.BaseDirectory + tableName + "&lt;span style="color: #8b0000;"&gt;.xml&lt;/span&gt;";&lt;br/&gt;            &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; _currentPage = &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;.Parse(context.Request.QueryString["&lt;span style="color: #8b0000;"&gt;page&lt;/span&gt;"].ToString());    &lt;span style="color: #008000;"&gt;// get the context.Requested page&lt;/span&gt;&lt;br/&gt;            &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; _pageStep = &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;.Parse(context.Request.QueryString["&lt;span style="color: #8b0000;"&gt;rows&lt;/span&gt;"].ToString());     &lt;span style="color: #008000;"&gt;// get how many rows we want to have into the grid&lt;/span&gt;&lt;br/&gt;            &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; sidx = context.Request.QueryString["&lt;span style="color: #8b0000;"&gt;sidx&lt;/span&gt;"].ToString();        &lt;span style="color: #008000;"&gt;// get index row - i.e. user click to sort&lt;/span&gt;&lt;br/&gt;            &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; sord = context.Request.QueryString["&lt;span style="color: #8b0000;"&gt;sord&lt;/span&gt;"].ToString();      &lt;span style="color: #008000;"&gt;// get the direction&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;            &lt;span style="color: #008000;"&gt;//params from XML&lt;/span&gt;&lt;br/&gt;            XmlDocument xmlDoc = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; XmlDocument();&lt;br/&gt;            xmlDoc.Load(xmlPath);&lt;br/&gt;            XmlNode xnRoot = xmlDoc.SelectSingleNode("&lt;span style="color: #8b0000;"&gt;root&lt;/span&gt;");&lt;br/&gt;            &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; fields = xnRoot.Attributes["&lt;span style="color: #8b0000;"&gt;fields&lt;/span&gt;"].Value;&lt;br/&gt;            &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; fixCondition = &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.Empty;                            &lt;span style="color: #008000;"&gt;//固&amp;igrave;定&amp;uml;条?件t&lt;/span&gt;&lt;br/&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (xnRoot.Attributes["&lt;span style="color: #8b0000;"&gt;fixCondition&lt;/span&gt;"] != &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;) fixCondition = xnRoot.Attributes["&lt;span style="color: #8b0000;"&gt;fixCondition&lt;/span&gt;"].Value;&lt;br/&gt;&lt;br/&gt;            DataTable dt = SqlHelper.GetDataByPager(fields, tableName, "&lt;span style="color: #8b0000;"&gt; 1=1 &lt;/span&gt;" + fixCondition + searchCase, sidx + "&lt;span style="color: #8b0000;"&gt; &lt;/span&gt;" + sord, (_currentPage - 1), _pageStep);&lt;br/&gt;            &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; _recordCount = SqlHelper.GetRecordCount(tableName, "&lt;span style="color: #8b0000;"&gt; 1=1 &lt;/span&gt;" + fixCondition + searchCase);&lt;br/&gt;            &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; _totalPages;&lt;br/&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (_recordCount % _pageStep == 0)&lt;br/&gt;            {&lt;br/&gt;                _totalPages = _recordCount / _pageStep;&lt;br/&gt;            }&lt;br/&gt;            &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br/&gt;            {&lt;br/&gt;                _totalPages = _recordCount / _pageStep + 1;&lt;br/&gt;            }&lt;br/&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (_recordCount == 0)&lt;br/&gt;            {&lt;br/&gt;                &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.Empty;&lt;br/&gt;            }&lt;br/&gt;            &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br/&gt;            {&lt;br/&gt;                &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; DataTableToJson(dt, _currentPage, _totalPages, _recordCount, xmlDoc);&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;其中使用到了SqlHelper.cs提供的SQL2005存储过程。&lt;/p&gt;&lt;p&gt;public string DataTableToJson(DataTable dt, int page, int total, int records, XmlDocument xmlDoc)用于DataTable转化为jqGrid格式的字符串，其代码如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;img height="16" width="11" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_157224').style.display='none'; document.getElementById('Code_Open_Image_157224').style.display='inline'; document.getElementById('Code_Open_Text_157224').style.display='inline';" id="Code_Closed_Image_157224" /&gt;&lt;img height="16" width="11" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_157224').style.display='none'; getElementById('Code_Closed_Image_157224').style.display='inline'; getElementById('Code_Closed_Text_157224').style.display='inline';" id="Code_Open_Image_157224" style="display: none;" /&gt;&lt;span class="cnblogs_code_Collapse" id="Code_Closed_Text_157224"&gt;&lt;/span&gt;&lt;span id="Code_Open_Text_157224" style="display: none;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; DataTableToJson(DataTable dt, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; page, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; total, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; records, XmlDocument xmlDoc)&lt;br/&gt;        {&lt;br/&gt;            XmlNodeList xnList = xmlDoc.SelectNodes("&lt;span style="color: #8b0000;"&gt;root//columns&lt;/span&gt;");&lt;br/&gt;            &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; idKey = &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.Empty;&lt;br/&gt;            &lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt; (XmlNode xn &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; xnList)&lt;br/&gt;            {&lt;br/&gt;                &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (xn.Attributes["&lt;span style="color: #8b0000;"&gt;IsIdentity&lt;/span&gt;"] != &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;)&lt;br/&gt;                {&lt;br/&gt;                    idKey = xn.Attributes["&lt;span style="color: #8b0000;"&gt;name&lt;/span&gt;"].Value;&lt;br/&gt;                }&lt;br/&gt;            }&lt;br/&gt;            StringBuilder sb = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; StringBuilder();&lt;br/&gt;            sb.Append("&lt;span style="color: #8b0000;"&gt;{&lt;/span&gt;");&lt;br/&gt;            sb.Append("&lt;span style="color: #8b0000;"&gt;\"page\":&lt;/span&gt;" + page + "&lt;span style="color: #8b0000;"&gt;,&lt;/span&gt;");&lt;br/&gt;            sb.Append("&lt;span style="color: #8b0000;"&gt;\"total\":&lt;/span&gt;" + total + "&lt;span style="color: #8b0000;"&gt;,&lt;/span&gt;");&lt;br/&gt;            sb.Append("&lt;span style="color: #8b0000;"&gt;\"records\":&lt;/span&gt;" + records + "&lt;span style="color: #8b0000;"&gt;,&lt;/span&gt;");&lt;br/&gt;            &lt;span style="color: #008000;"&gt;//-----------rows build&lt;/span&gt;&lt;br/&gt;            sb.Append("&lt;span style="color: #8b0000;"&gt;\"rows\":[&lt;/span&gt;");&lt;br/&gt;            &lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt; (DataRow dr &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; dt.Rows)&lt;br/&gt;            {&lt;br/&gt;                sb.Append("&lt;span style="color: #8b0000;"&gt;{\"id\":\"&lt;/span&gt;" + dr[idKey] + "&lt;span style="color: #8b0000;"&gt;\",&lt;/span&gt;");&lt;br/&gt;                sb.Append("&lt;span style="color: #8b0000;"&gt;\"cell\":[&lt;/span&gt;");&lt;br/&gt;                &lt;span style="color: #008000;"&gt;//-----------columns build&lt;/span&gt;&lt;br/&gt;                &lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt; (XmlNode xn &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; xnList)&lt;br/&gt;                {&lt;br/&gt;                    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (xn.Attributes["&lt;span style="color: #8b0000;"&gt;name&lt;/span&gt;"].Value != idKey)&lt;br/&gt;                    {&lt;br/&gt;                        &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; values = dr[xn.Attributes["&lt;span style="color: #8b0000;"&gt;name&lt;/span&gt;"].Value].ToString();&lt;br/&gt;                        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (values.IndexOf("&lt;span style="color: #8b0000;"&gt;\n&lt;/span&gt;") &amp;gt;= 0)  &lt;span style="color: #008000;"&gt;//解决JSON字符串含回车时的&amp;ldquo;未终止的字符串常量&amp;rdquo;问题&lt;/span&gt;&lt;br/&gt;                        {&lt;br/&gt;                            values = values.Replace("&lt;span style="color: #8b0000;"&gt;\n&lt;/span&gt;", "&lt;span style="color: #8b0000;"&gt;\\n&lt;/span&gt;");&lt;br/&gt;                        }&lt;br/&gt;                        &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (values.IndexOf('"&lt;span style="color: #8b0000;"&gt;') &amp;gt;= 0)  //解决&lt;/span&gt;"造成json字符串断层的问题，使用中文的&amp;rdquo;解决或单引号解决&lt;br/&gt;                        {&lt;br/&gt;                            values = values.Replace('"&lt;span style="color: #8b0000;"&gt;', '&amp;ldquo;&amp;deg;');&lt;/span&gt;&lt;br/&gt;                        }&lt;br/&gt;                        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (xn.Attributes["&lt;span style="color: #8b0000;"&gt;sorttype&lt;/span&gt;"] != &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;)&lt;br/&gt;                        {&lt;br/&gt;                            &lt;span style="color: #0000ff;"&gt;switch&lt;/span&gt; (xn.Attributes["&lt;span style="color: #8b0000;"&gt;sorttype&lt;/span&gt;"].Value)&lt;br/&gt;                            {&lt;br/&gt;                                &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; "&lt;span style="color: #8b0000;"&gt;data&lt;/span&gt;":&lt;br/&gt;                                    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (dr[xn.Attributes["&lt;span style="color: #8b0000;"&gt;name&lt;/span&gt;"].Value] != DBNull.Value)&lt;br/&gt;                                    {&lt;br/&gt;                                        sb.Append("&lt;span style="color: #8b0000;"&gt;\"&lt;/span&gt;" + DateTime.Parse(values) + "&lt;span style="color: #8b0000;"&gt;\",&lt;/span&gt;");&lt;br/&gt;                                    }&lt;br/&gt;                                    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br/&gt;                                    {&lt;br/&gt;                                        sb.Append("&lt;span style="color: #8b0000;"&gt;\" \",&lt;/span&gt;");&lt;br/&gt;                                    }&lt;br/&gt;                                    &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br/&gt;                                &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; "&lt;span style="color: #8b0000;"&gt;float&lt;/span&gt;":&lt;br/&gt;                                    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (dr[xn.Attributes["&lt;span style="color: #8b0000;"&gt;name&lt;/span&gt;"].Value] != DBNull.Value)&lt;br/&gt;                                    {&lt;br/&gt;                                        sb.Append("&lt;span style="color: #8b0000;"&gt;\"&lt;/span&gt;" + Decimal.Parse(values).ToString("&lt;span style="color: #8b0000;"&gt;0.00&lt;/span&gt;") + "&lt;span style="color: #8b0000;"&gt;\",&lt;/span&gt;");&lt;br/&gt;                                    }&lt;br/&gt;                                    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br/&gt;                                    {&lt;br/&gt;                                        sb.Append("&lt;span style="color: #8b0000;"&gt;\" \",&lt;/span&gt;");&lt;br/&gt;                                    }&lt;br/&gt;                                    &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br/&gt;                                &lt;span style="color: #0000ff;"&gt;default&lt;/span&gt;:&lt;br/&gt;                                    sb.Append("&lt;span style="color: #8b0000;"&gt;\"&lt;/span&gt;" + values + "&lt;span style="color: #8b0000;"&gt;\",&lt;/span&gt;");&lt;br/&gt;                                    &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br/&gt;                            }&lt;br/&gt;                        }&lt;br/&gt;                        &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br/&gt;                        {&lt;br/&gt;                            sb.Append("&lt;span style="color: #8b0000;"&gt;\"&lt;/span&gt;" + values + "&lt;span style="color: #8b0000;"&gt;\",&lt;/span&gt;");&lt;br/&gt;                        }&lt;br/&gt;                    }&lt;br/&gt;                }&lt;br/&gt;                sb.Remove(sb.Length - 1, 1);&lt;br/&gt;                &lt;span style="color: #008000;"&gt;//-----------end columns build&lt;/span&gt;&lt;br/&gt;                sb.Append("&lt;span style="color: #8b0000;"&gt;]&lt;/span&gt;");&lt;br/&gt;                sb.Append("&lt;span style="color: #8b0000;"&gt;},&lt;/span&gt;");&lt;br/&gt;            }&lt;br/&gt;            sb.Remove(sb.ToString().Length - 1, 1);&lt;br/&gt;            sb.Append("&lt;span style="color: #8b0000;"&gt;]&lt;/span&gt;");&lt;br/&gt;            &lt;span style="color: #008000;"&gt;//----------end rows build&lt;/span&gt;&lt;br/&gt;            sb.Append("&lt;span style="color: #8b0000;"&gt;}&lt;/span&gt;");&lt;br/&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; sb.ToString();&lt;br/&gt;        }&lt;br/&gt;&lt;/span&gt;&lt;p&gt;&lt;br /&gt;&lt;span id="Code_Open_Text_614053" style="display: none;"&gt;&lt;p&gt;从以上两个方法可以看到，传过来的值中，自定义了一个QueryString，tablename用于取得对应的配置文件，也可以使用反射的方法去提供数据，但是相对于来说，很不灵活。&lt;/p&gt;&lt;p&gt;4，在ProcessRequest方法中编码对于前台的动作反馈相应的数据，以下是部分代码：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;pre&gt;&lt;img height="16" width="11" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_835971').style.display='none'; document.getElementById('Code_Open_Image_835971').style.display='inline'; document.getElementById('Code_Open_Text_835971').style.display='inline';" id="Code_Closed_Image_835971" /&gt;&lt;img height="16" width="11" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_835971').style.display='none'; getElementById('Code_Closed_Image_835971').style.display='inline'; getElementById('Code_Closed_Text_835971').style.display='inline';" id="Code_Open_Image_835971" style="display: none;" /&gt;&lt;span class="cnblogs_code_Collapse" id="Code_Closed_Text_835971"&gt;&lt;/span&gt;&lt;span id="Code_Open_Text_835971" style="display: none;"&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (context.Request.QueryString["&lt;span style="color: #8b0000;"&gt;action&lt;/span&gt;"] != &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;)&lt;br/&gt;            {&lt;br/&gt;                &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; actions = context.Request.QueryString["&lt;span style="color: #8b0000;"&gt;action&lt;/span&gt;"].ToString();&lt;br/&gt;                &lt;span style="color: #0000ff;"&gt;switch&lt;/span&gt; (actions)&lt;br/&gt;                {&lt;br/&gt;                    &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; "&lt;span style="color: #8b0000;"&gt;view&lt;/span&gt;":&lt;br/&gt;                            context.Response.Write(jsonString(context));&lt;br/&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;传过来的值中，自定义了一个QueryString，&lt;span style="color: #8b0000;"&gt;action&lt;/span&gt;用于判别前台传过来的动作，用于后面还有的查询，编辑，修改，删除等功能。&lt;/p&gt;&lt;p&gt;这里只反馈数据用于前台的显示。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;这样，AjaxData完成。&lt;/p&gt;&lt;p&gt;接下来可以建立一个前台项目，为中上面的方法中获取数据，在web.config声明httpHandlers：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;img height="16" width="11" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_767779').style.display='none'; document.getElementById('Code_Open_Image_767779').style.display='inline'; document.getElementById('Code_Open_Text_767779').style.display='inline';" id="Code_Closed_Image_767779" /&gt;&lt;img height="16" width="11" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_767779').style.display='none'; getElementById('Code_Closed_Image_767779').style.display='inline'; getElementById('Code_Closed_Text_767779').style.display='inline';" id="Code_Open_Image_767779" style="display: none;" /&gt;&lt;span class="cnblogs_code_Collapse" id="Code_Closed_Text_767779"&gt;&lt;/span&gt;&lt;span id="Code_Open_Text_767779" style="display: none;"&gt;&amp;lt;httpHandlers&amp;gt;&lt;br/&gt;        &amp;lt;add path="&lt;span style="color: #8b0000;"&gt;data.ashx&lt;/span&gt;" verb="&lt;span style="color: #8b0000;"&gt;*&lt;/span&gt;" type="&lt;span style="color: #8b0000;"&gt;AspJqGrid.AjaxData,AspJqGrid&lt;/span&gt;"/&amp;gt;&lt;br/&gt;      &amp;lt;/httpHandlers&amp;gt;&lt;br/&gt;&lt;/span&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;位于system.web节点下，这样，就将页面请求定位到了AspJqGrid的AjaxData类&lt;/p&gt;&lt;p&gt;另外，在控件代码中加入了[assembly:TagPrefix("AspJqGrid","AllenJqGrid")]，在web.config中声明全局&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;pre&gt;&lt;img height="16" width="11" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_262682').style.display='none'; document.getElementById('Code_Open_Image_262682').style.display='inline'; document.getElementById('Code_Open_Text_262682').style.display='inline';" id="Code_Closed_Image_262682" /&gt;&lt;img height="16" width="11" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_262682').style.display='none'; getElementById('Code_Closed_Image_262682').style.display='inline'; getElementById('Code_Closed_Text_262682').style.display='inline';" id="Code_Open_Image_262682" style="display: none;" /&gt;&lt;span class="cnblogs_code_Collapse" id="Code_Closed_Text_262682"&gt;&lt;/span&gt;&lt;span id="Code_Open_Text_262682" style="display: none;"&gt;&amp;lt;pages&amp;gt;&lt;br/&gt;        &amp;lt;controls&amp;gt;&lt;br/&gt;          &amp;lt;add tagPrefix="&lt;span style="color: #8b0000;"&gt;AllenJqGrid&lt;/span&gt;" assembly="&lt;span style="color: #8b0000;"&gt;AspJqGrid&lt;/span&gt;" &lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt;="&lt;span style="color: #8b0000;"&gt;AspJqGrid&lt;/span&gt;" /&amp;gt;&lt;br/&gt;        &amp;lt;/controls&amp;gt;&lt;br/&gt;      &amp;lt;/pages&amp;gt;&lt;br/&gt;&lt;/span&gt;&lt;p&gt;第一步的Hello World显示方面的工作就完成了，下一篇开始编码查询功能&lt;/p&gt;&lt;/div&gt;&lt;p&gt;这样，在页面中添加&amp;lt;AllenJqGrid:JqGrid ID="MyJqGrid" runat="server" TableName="diamond" /&amp;gt;&lt;/p&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/pre&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/bestfc/aggbug/1753685.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/bestfc/archive/2010/06/08/1753685.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/bestfc/archive/2010/06/07/1753216.html</id><title type="text">封装jQuery表格插件jqGrid，控件化jqGrid（一）：显示</title><summary type="text">先上完结后效果图（点击放大）: 功能：排序，列宽拖拉，自动行号，添加，编辑，删除，查询等只要在页面中引入：jquery.js及&lt;AllenJqGrid:JqGrid ID="MyJqGrid" runat="server" TableName="diamond" Search="true" Add="true" Edit="true" Del="true" /&gt;这么一段，上图就将呈现在...</summary><published>2010-06-07T06:48:00Z</published><updated>2010-06-07T06:48:00Z</updated><author><name>黑曜石</name><uri>http://www.cnblogs.com/bestfc/</uri></author><link rel="alternate" href="http://www.cnblogs.com/bestfc/archive/2010/06/07/1753216.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/bestfc/archive/2010/06/07/1753216.html"/><content type="html">&lt;p&gt;先上完结后效果图（点击放大）:&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/bestfc/WindowsLiveWriter/jQueryjqGridjqGrid_ABA5/image_2.png"&gt;&lt;img height="162" width="244" src="http://images.cnblogs.com/cnblogs_com/bestfc/WindowsLiveWriter/jQueryjqGridjqGrid_ABA5/image_thumb.png" alt="image" border="0" title="image" style="display: inline; border-width: 0px;" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;功能：排序，列宽拖拉，自动行号，添加，编辑，删除，查询等&lt;/p&gt;&lt;p&gt;只要在页面中引入：jquery.js及&lt;/p&gt;&lt;p&gt;&amp;lt;AllenJqGrid:JqGrid ID="MyJqGrid" runat="server" TableName="diamond" Search="true" Add="true" Edit="true" Del="true" /&amp;gt;&lt;/p&gt;&lt;p&gt;这么一段，上图就将呈现在浏览器中。&lt;/p&gt;&lt;p&gt;注：本控件数据提供仅使用json。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;写在前面的，为何要控件化&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这里&lt;a href="http://www.trirand.com/jqgrid/jqgrid.html"&gt;http://www.trirand.com/jqgrid/jqgrid.html&lt;/a&gt;是官方的jqGrid Demo页。&lt;/p&gt;&lt;p&gt;其基本的页面JS如下：&lt;/p&gt;&lt;div&gt;jQuery("&lt;span style="color: #8b0000;"&gt;#list2&lt;/span&gt;").jqGrid({   url:'server.php?q=2',datatype: "&lt;span style="color: #8b0000;"&gt;json&lt;/span&gt;",   colNames:['Inv No','Date', 'Client', 'Amount','Tax','Total','Notes'],   colModel:[   {name:'id',index:'id', width:55},   {name:'invdate',index:'invdate', width:90},   {name:'name',index:'name asc, invdate', width:100},   {name:'amount',index:'amount', width:80, align:"&lt;span style="color: #8b0000;"&gt;right&lt;/span&gt;"},   {name:'tax',index:'tax', width:80, align:"&lt;span style="color: #8b0000;"&gt;right&lt;/span&gt;"},   {name:'total',index:'total', width:80,align:"&lt;span style="color: #8b0000;"&gt;right&lt;/span&gt;"},   {name:'note',index:'note', width:150, sortable:&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;}   ],   rowNum:10,   rowList:[10,20,30],   pager: '#pager2',   sortname: 'id',    viewrecords: &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;,    sortorder: "&lt;span style="color: #8b0000;"&gt;desc&lt;/span&gt;",    caption:"&lt;span style="color: #8b0000;"&gt;JSON Example&lt;/span&gt;"});jQuery("&lt;span style="color: #8b0000;"&gt;#list2&lt;/span&gt;").jqGrid('navGrid','#pager2',{edit:&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;,add:&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;,del:&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;});&lt;/div&gt;&lt;p&gt;这只是基本的配置就有这么多，用过的人应该会知道jqGrid有很丰富的API，但常用的其实也就那么几个，值也差不多。&lt;/p&gt;&lt;p&gt;我在一个项目中的表格大部分都是使用jqGrid实现，大部分时候都是Ctrl+C，然后Ctrl+V，最后改改。&lt;/p&gt;&lt;p&gt;改改的时候经常就会发生默名的错误，基本上找了半天，发现就是少了个逗号或JSON出问题之类。&lt;/p&gt;&lt;p&gt;所以为了不复制粘贴，不重复的设置各项功能及其服务器对应的功能代码，控件化有必要。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;控件制作正式开始&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;一，文件准备：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;开个项目，asp.net服务器控件，这里命名为AspJqGrid，VS2010会自动生成一个cs控件文件，留下&lt;/p&gt;&lt;p&gt;protected override void RenderContents(HtmlTextWriter output)，用于输出控件&lt;/p&gt;&lt;p&gt;接下来，将jqGrid需要的文件接入项目&lt;/p&gt;&lt;p&gt;新建文件夹Css，将ui.jqgrid.css复制进去&lt;/p&gt;&lt;p&gt;新建文件夹Script，将grid.locale-cn.js和jquery.jqGrid.min.js复制进去，前一个文件用于本地化，也是不可缺的&lt;/p&gt;&lt;p&gt;为使用系统资源，调整复制进来的三个文件的属性，如图：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/bestfc/WindowsLiveWriter/jQueryjqGridjqGrid_ABA5/image_4.png"&gt;&lt;img height="140" width="244" src="http://images.cnblogs.com/cnblogs_com/bestfc/WindowsLiveWriter/jQueryjqGridjqGrid_ABA5/image_thumb_1.png" alt="image" border="0" title="image" style="display: inline; border-width: 0px;" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;另外在Properties中的AssemblyInfo.cs中声明如下：&lt;/p&gt;&lt;p&gt;[assembly: WebResource("AspJqGrid.Css.ui.jqgrid.css", "text/css")] &lt;br /&gt;[assembly: WebResource("AspJqGrid.Scripts.grid.locale-cn.js", "application/x-javascript", PerformSubstitution = true)] &lt;br /&gt;[assembly: WebResource("AspJqGrid.Scripts.jquery.jqGrid.min.js", "application/x-javascript", PerformSubstitution = true)]&lt;/p&gt;&lt;p&gt;这样，文件类的资源准备完毕。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;二，编码控件主体：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;1）根据jqGrid表体的各项参数，设置参数&lt;/p&gt;&lt;p&gt;如：参数_rowNum声明，其它的_sortname,_sortorder,_rowList等都一样&lt;/p&gt;&lt;div&gt;&lt;span style="color: #008000;"&gt;//每页显示行数默认50&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; _rowNum = 50;        [Description("&lt;span style="color: #8b0000;"&gt;每页显示行数&lt;/span&gt;")]        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; RowNum        {            get { &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; _rowNum; }            set { _rowNum = value; }        }&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2）在控件输出之前，需要向页面输出一些必要的文件资源&lt;/p&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; OnPreRender(EventArgs e)        {            &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.Page.PreRenderComplete += &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; EventHandler(Page_PreRenderComplete);            &lt;span style="color: #0000ff;"&gt;base&lt;/span&gt;.OnPreRender(e);        }        &lt;span style="color: #008000;"&gt;//向页面注册css和js&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Page_PreRenderComplete(&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt; sender, EventArgs e)        {            HtmlLink jqGridStyle = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; HtmlLink();            jqGridStyle.Attributes["&lt;span style="color: #8b0000;"&gt;type&lt;/span&gt;"] = "&lt;span style="color: #8b0000;"&gt;text/css&lt;/span&gt;";            jqGridStyle.Attributes["&lt;span style="color: #8b0000;"&gt;rel&lt;/span&gt;"] = "&lt;span style="color: #8b0000;"&gt;stylesheet&lt;/span&gt;";            jqGridStyle.Attributes["&lt;span style="color: #8b0000;"&gt;href&lt;/span&gt;"] = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.Page.ClientScript.GetWebResourceUrl(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.GetType(), "&lt;span style="color: #8b0000;"&gt;AspJqGrid.Css.ui.jqgrid.css&lt;/span&gt;");            &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.Page.Header.Controls.Add(jqGridStyle);            &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.Page.ClientScript.RegisterClientScriptResource(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.GetType(), "&lt;span style="color: #8b0000;"&gt;AspJqGrid.Scripts.grid.locale-cn.js&lt;/span&gt;");            &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.Page.ClientScript.RegisterClientScriptResource(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.GetType(), "&lt;span style="color: #8b0000;"&gt;AspJqGrid.Scripts.jquery.jqGrid.min.js&lt;/span&gt;");        }&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;3）构造控件输出到页面的JS，使用StringBuilder，将第一步的各参数融入，以下是部分&lt;/p&gt;&lt;div&gt;StringBuilder sb = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; StringBuilder();            sb.Append("&lt;span style="color: #8b0000;"&gt;\n&amp;lt;script type=\"text/javascript\"&amp;gt;\n&lt;/span&gt;");            sb.Append("&lt;span style="color: #8b0000;"&gt;$(function(){\n&lt;/span&gt;");            &lt;span style="color: #008000;"&gt;//-----------------------------------------------jqGrid js构1造&amp;igrave;开a始?&lt;/span&gt;            sb.Append("&lt;span style="color: #8b0000;"&gt;$(\"#&lt;/span&gt;" + &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.ID + "&lt;span style="color: #8b0000;"&gt;Table\").jqGrid({\n&lt;/span&gt;");            sb.Append("&lt;span style="color: #8b0000;"&gt;url:\"data.ashx?tablename=&lt;/span&gt;" + TableName + "&lt;span style="color: #8b0000;"&gt;&amp;amp;action=view\",\n&lt;/span&gt;");            sb.Append("&lt;span style="color: #8b0000;"&gt;datatype: 'json',\n&lt;/span&gt;");   &lt;span style="color: #008000;"&gt;//此?处鋦原-为adataType，?则&amp;ograve;无T法ぁ?处鋦理え?数簓据Y状痢?态?，?大洙?小?写&amp;prime;敏?感D&lt;/span&gt;            sb.Append("&lt;span style="color: #8b0000;"&gt;rowNum: &lt;/span&gt;" + RowNum + "&lt;span style="color: #8b0000;"&gt;,\n&lt;/span&gt;");            sb.Append("&lt;span style="color: #8b0000;"&gt;pager: '#&lt;/span&gt;" + &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.ID + "&lt;span style="color: #8b0000;"&gt;Pager',\n&lt;/span&gt;");            sb.Append("&lt;span style="color: #8b0000;"&gt;sortname: '&lt;/span&gt;" + Sortname + "&lt;span style="color: #8b0000;"&gt;',\n&lt;/span&gt;");            sb.Append("&lt;span style="color: #8b0000;"&gt;sortorder: '&lt;/span&gt;" + Sortorder + "&lt;span style="color: #8b0000;"&gt;',\n&lt;/span&gt;");&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 其中页面构造最复杂的是colModel，这里使用XML文件配置colModel，为此需要新建类，用于自动生成基本的XML配置文件。&lt;/p&gt;&lt;p&gt;新建一个表体列属性的model类，命名为jqGridColumns&lt;/p&gt;&lt;p&gt;包含属性：&lt;/p&gt;&lt;p&gt;private string columnName;&lt;/p&gt;&lt;p&gt;private int columnSize;&lt;/p&gt;&lt;p&gt;private string dataType;&lt;/p&gt;&lt;p&gt;private bool isIdentity = false;&lt;/p&gt;&lt;p&gt;private List&amp;lt;jqGridColumns&amp;gt; jqGridColumnsList = new List&amp;lt;jqGridColumns&amp;gt;();&lt;/p&gt;&lt;p&gt;新建一个配置文件生成类，命名为jqGridColumnsConfig&lt;/p&gt;&lt;p&gt;包含两个方法：&lt;/p&gt;&lt;p&gt;public List&amp;lt;jqGridColumns&amp;gt; GetColumnsList(string fields, string tableName)&lt;/p&gt;&lt;p&gt;其核心为使用SqlDataReader的GetSchemaTable方法，获得表体的列属性&lt;/p&gt;&lt;p&gt;public void BuildColModelXML(string xmlDocPath,string fields,string tableName)&lt;/p&gt;&lt;p&gt;使用第一个方法后得到表体的列属性，生成colModel的XML配置文件，包含基本的colModel API，完成colModel配置文件的自动生成。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;接下来继续主体控件输入JS编程，决断是否存在配置文件，否则使用上述提供的方法，自动生成colModel的配置文件&lt;/p&gt;&lt;p&gt;然后读取XML配置文件，以colModel格式输出JS。&lt;/p&gt;&lt;p&gt;4）最后输出控件，包含页面JS和表体框架&lt;/p&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; RenderContents(HtmlTextWriter output)        {            &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; jqGridTag = "&lt;span style="color: #8b0000;"&gt;\n&amp;lt;table id=\"&lt;/span&gt;" + &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.ID + "&lt;span style="color: #8b0000;"&gt;Table\"&amp;gt;&amp;lt;/table&amp;gt;\n&amp;lt;div id=\"&lt;/span&gt;" + &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.ID + "&lt;span style="color: #8b0000;"&gt;Pager\"&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;";            output.Write(BuildJqGridHtml() + jqGridTag);        }&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;至些，完成控件主体编码工作，下一篇完成为jqGrid提供数据的类&lt;/p&gt;&lt;img src="http://www.cnblogs.com/bestfc/aggbug/1753216.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/bestfc/archive/2010/06/07/1753216.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
