<?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/12338/rss</id><updated>2011-12-10T10:03:00Z</updated><author><name>蛙蛙王子</name><uri>http://www.cnblogs.com/onlytiancai/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/onlytiancai/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/12338/rss"/><entry><id>http://www.cnblogs.com/onlytiancai/archive/2011/12/10/backbone.html</id><title type="text">蛙蛙推荐：Backbone官方文档翻译</title><summary type="text">Backbone是一个非常棒的javascript MVC框架，使用它开发web应用，可以让你的客户端代码更少，更清新，更容易维护，更帅，下面是对官方文档的翻译</summary><published>2011-12-10T10:03:00Z</published><updated>2011-12-10T10:03:00Z</updated><author><name>蛙蛙王子</name><uri>http://www.cnblogs.com/onlytiancai/</uri></author><link rel="alternate" href="http://www.cnblogs.com/onlytiancai/archive/2011/12/10/backbone.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/onlytiancai/archive/2011/12/10/backbone.html"/><content type="html">&lt;p&gt;&lt;em&gt;Backbone是一个非常棒的javascript MVC框架，使用它开发web应用，可以让你的客户端代码更少，更清新，更容易维护，更帅，下面是对官方文档的翻译&lt;/em&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;翻译未完成，而且不是特别的忠实于原文，因为我英语非常的差，所以是按自己的理解来翻译的，看英文没有压力的同学尽量看英文原文，或帮助我一起翻译，谢谢。&lt;/em&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://github.com/documentcloud/backbone/" rel="nofollow"&gt;Backbone&lt;/a&gt;为开发Javascript应用程序提供了一套架构，包括基于健值对儿(attributes)和自定义事件的&lt;strong&gt;Model&lt;/strong&gt;，具有丰富的枚举API(译注：依赖于underscore的集合操作)的&lt;strong&gt;Collections&lt;/strong&gt;，以及可以声明自定义事件处理函数的&lt;strong&gt;View&lt;/strong&gt;，并且可以把这些连接到一个现有的RESTful的JSON接口。&lt;/p&gt;&#xD;
&lt;p&gt;这个项目托管在&lt;a href="http://github.com/documentcloud/backbone/" rel="nofollow"&gt;GitHub&lt;/a&gt;上，并且有&lt;a href="http://documentcloud.github.com/backbone/docs/backbone.html" rel="nofollow"&gt;带有注释的代码&lt;/a&gt;,以及&lt;a href="http://documentcloud.github.com/backbone/test/test.html" rel="nofollow"&gt;在线测试套件&lt;/a&gt;,&lt;a href="http://documentcloud.github.com/backbone/examples/todos/index.html" rel="nofollow"&gt;示例&lt;/a&gt;和&lt;a href="http://documentcloud.github.com/backbone/examples/todos/index.html" rel="nofollow"&gt;系列指南&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;您可以在&lt;a href="http://github.com/documentcloud/backbone/issues" rel="nofollow"&gt;Github的问题页面&lt;/a&gt;提交bug或讨论功能，在Freenode&amp;nbsp;&lt;em&gt;#documentcloud&lt;/em&gt;频道进行IRC交流，或在&lt;a href="https://groups.google.com/forum/#!forum/backbonejs" rel="nofollow"&gt;google group&lt;/a&gt;提出问题，以及发送twitter给&lt;a href="http://twitter.com/documentcloud" rel="nofollow"&gt;@documentcloud&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Backbone是&lt;a href="http://documentcloud.org/" rel="nofollow"&gt;DocumentCloud&lt;/a&gt;的一个开源组件。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;下载和依赖&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://documentcloud.github.com/backbone/backbone.js" rel="nofollow"&gt;开发版本&lt;/a&gt;&amp;nbsp;41kb 全部源码及注释&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://documentcloud.github.com/backbone/backbone-min.js" rel="nofollow"&gt;生产环境版本&lt;/a&gt;&amp;nbsp;4.6k 打包并且Gzip压缩&lt;/p&gt;&#xD;
&lt;p&gt;Backone唯一的硬依赖就是&lt;a href="http://documentcloud.github.com/underscore/" rel="nofollow"&gt;Underscore.js&lt;/a&gt;,为了让&lt;a&gt;Backbone.Route&lt;/a&gt;支持RESTfull持久化和历史以及让&lt;a&gt;Backbone.View&lt;/a&gt;来操作Dom，需要包含&lt;a href="https://github.com/douglascrockford/JSON-js" rel="nofollow"&gt;json2.js&lt;/a&gt;，还有&lt;a href="http://jquery.com/" rel="nofollow"&gt;jQuery&lt;/a&gt;或&lt;a href="http://zeptojs.com/" rel="nofollow"&gt;Zepto&lt;/a&gt;.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;0.50+更新&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;我们借此机会澄清一些0.5.0版本里的一些命名。&lt;em&gt;Controller&lt;/em&gt;现在叫&lt;a&gt;&lt;strong&gt;Router&lt;/strong&gt;&lt;/a&gt;,&lt;em&gt;refresh&lt;/em&gt;现在叫&lt;a&gt;&lt;strong&gt;reset&lt;/strong&gt;&lt;/a&gt;,以前的&lt;em&gt;saveLocation&lt;/em&gt;和&lt;em&gt;setLocation&lt;/em&gt;函数，现在用&lt;a&gt;&lt;strong&gt;navigate&lt;/strong&gt;&lt;/a&gt;替换了，&lt;em&gt;Backbone.sync&lt;/em&gt;方法现在支持&lt;em&gt;jquery.ajax&lt;/em&gt;的任何选项了，如果你想使用&lt;em&gt;pushState&lt;/em&gt;特性，必须确保调用了&lt;a&gt;&lt;em&gt;History.Start&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;简介&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;开发web应用程序时，都会涉及大量的javascript，你要学习的第一件事就是阻止数据直接写在Dom上。用jquery的选择器和回调可以很容易的创建web应用，很直接的操作 DOM，并且很容易的和服务器端数据库之间进行数据同步。但要开发一个富客户端应用则需要一套更有条理的方法。&lt;/p&gt;&#xD;
&lt;p&gt;Backbone里，Models代表你的数据，它可以创建，校验，销毁，以及把数据保存到服务器。每当UI的动作触发了Model的一个属性变化时，Model会引发一个&lt;em&gt;change&lt;/em&gt;时间，所有的&lt;em&gt;Views&lt;/em&gt;可以在收到事件时呈现自己所包含的Model的数据，或者重新呈现数据。你不需要写胶水代码来通过id来查找dom元素，并手动更新HTML-当Model发生改变，View只需简单的更新自己。&lt;/p&gt;&#xD;
&lt;p&gt;下面的很多例子可以运行。点击&amp;ldquo;play&amp;rdquo;按钮可以执行他们。（译注：在这里不能点，到原页面点去）&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Backbone.Events&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;Events&lt;/em&gt;是一个可以附加给任何对象的模块，它让对象提供绑定和触发自定义命名事件的能力。Events不需要在绑定前定义，并且可以传递参数，如下。&lt;/p&gt;&#xD;
&lt;div id="highlighter_344148" &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; object = {};&lt;br /&gt;&lt;br /&gt;_.extend(object, Backbone.Events);&lt;br /&gt;&lt;br /&gt;object.bind("alert", &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(msg) {&lt;br /&gt;  alert("Triggered " + msg);&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;object.trigger("alert", "an event");&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;bind&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;object.bind(event, callback, [context])&lt;/em&gt;&lt;/p&gt;&#xD;
&lt;p&gt;给对象绑定一个&lt;em&gt;callback&lt;/em&gt;，callback会在&lt;em&gt;event&lt;/em&gt;(根据一个字符串指定)触发时调用，如果你在一个页面上有大量的Event，你可以使用冒号隔开来进行命名空间划分，如&lt;em&gt;poll:start&lt;/em&gt;或&lt;em&gt;change:selection&lt;/em&gt;&lt;/p&gt;&#xD;
&lt;p&gt;为了给callback调用时提供一个上下文，你可以提供第三个参数，如&lt;em&gt;model.bind('change',this.render, this)&lt;/em&gt;&lt;/p&gt;&#xD;
&lt;p&gt;如果一个callback绑定在一个&lt;em&gt;all&lt;/em&gt;的事件上，则当任何事件发生时都会被调用，并且回调的第一个参数就是事件名字。下面这个例子是把一个对象的所有事件都代理给另一个对象。&lt;/p&gt;&#xD;
&lt;div id="highlighter_434766" &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;proxy.bind("all", &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(eventName) {&lt;br /&gt;  object.trigger(eventName);&lt;br /&gt;});&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;unbind&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;object.unbind([event], [callback])&lt;/em&gt;&lt;/p&gt;&#xD;
&lt;p&gt;移除掉之前绑定在一个对象上的事件处理回调，如果callback没指定，则移除指定事件的所有回调，如果event没指定，则移除该对象上的所有事件。&lt;/p&gt;&#xD;
&lt;div id="highlighter_955768" &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;object.unbind("change", onChange);  &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Removes just the onChange callback.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;object.unbind("change");            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Removes all "change" callbacks.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;object.unbind();                    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Removes all callbacks on object.&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;trigger&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;object.trigger(event, [&lt;/em&gt;args])*&lt;/p&gt;&#xD;
&lt;p&gt;触发给定的event的callbacks，指定的args会传递给callbacks。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Backbone.Model&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Models&lt;/strong&gt;是任何Javascript程序的核心，它包括程序的交互式数据以及数据相关的一大部分逻辑：如类型转换，验证，计算属性，访问控制。你可以扩展Backbone.Model来增加领域模型的方法和属性，并提供一个基本的变更（译注：CRUD等）功能。&lt;/p&gt;&#xD;
&lt;p&gt;下面这是一个例子，它定义了一个Model，并增加了自定义方法，设置了属性，绑定了一个特定属性变化事件(change:color)。如果你运行了下面的代码，浏览器侧栏会改变成你输入的颜色。(译注：请到原文地址进行演示)&lt;/p&gt;&#xD;
&lt;div id="highlighter_433566" &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; Sidebar = Backbone.Model.extend({&lt;br /&gt;  promptColor: &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;() {&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; cssColor = prompt("Please enter a CSS color:");&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.set({color: cssColor});&lt;br /&gt;  }&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;window.sidebar = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Sidebar;&lt;br /&gt;&lt;br /&gt;sidebar.bind('change:color', &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(model, color) {&lt;br /&gt;  $('#sidebar').css({background: color});&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;sidebar.set({color: 'white'});&lt;br /&gt;&lt;br /&gt;sidebar.promptColor();&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;extend&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;Backbone.Model.extend(properties, [classProperties])&lt;/em&gt;&lt;/p&gt;&#xD;
&lt;p&gt;要创建一个你自己的&lt;strong&gt;Model&lt;/strong&gt;，你需要extend一个Backbone.Model并提供实例属性&lt;em&gt;properties&lt;/em&gt;，也可以使用可选的&lt;em&gt;classProperties&lt;/em&gt;直接附加在构造函数上。(译注：没用过classProperties)&lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;extend&lt;/em&gt;可以正确的设置javascript原型链，你可以继续extend你定义好的Model,子类会自动继承父类的成员，并且可以在子类里覆盖父类成员，实现子类自定义的逻辑。&lt;/p&gt;&#xD;
&lt;div id="highlighter_402165" &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; Note = Backbone.Model.extend({&lt;br /&gt;&lt;br /&gt;  initialize: &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;() { ... },&lt;br /&gt;&lt;br /&gt;  author: &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;() { ... },&lt;br /&gt;&lt;br /&gt;  coordinates: &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;() { ... },&lt;br /&gt;&lt;br /&gt;  allowedToEdit: &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(account) {&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; PrivateNote = Note.extend({&lt;br /&gt;&lt;br /&gt;  allowedToEdit: &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(account) {&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; account.owns(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;});&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;javascript没有提供简单的办法调用父类的方法-就是高层的javascript原型链上同名的函数，如果你自己的Model覆盖了Backbone.Model的默认的方法如&lt;em&gt;set&lt;/em&gt;,&lt;em&gt;save&lt;/em&gt;等，并且你要调用父类的实现，你就必须显式的调用它，如下：&lt;/p&gt;&#xD;
&lt;div id="highlighter_924990" &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; Note = Backbone.Model.extend({&lt;br /&gt;  set: &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(attributes, options) {&lt;br /&gt;    Backbone.Model.prototype.set.call(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;, attributes, options);&lt;br /&gt;    ...&lt;br /&gt;  }&lt;br /&gt;});&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;constructor/initialize&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;new Model([attributes])&lt;/em&gt;&lt;/p&gt;&#xD;
&lt;p&gt;当你创建一个Model的实例时，你可以通过&lt;em&gt;attributes&lt;/em&gt;传递初始值，这些值会被在Model上进行&lt;em&gt;set&lt;/em&gt;，如果你的Model定义了一个&lt;em&gt;initialize&lt;/em&gt;方法，它会在创建实例时被调用。&lt;/p&gt;&#xD;
&lt;div id="highlighter_385282" &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Book({&lt;br /&gt;  title: "One Thousand and One Nights",&lt;br /&gt;  author: "Scheherazade"&lt;br /&gt;});&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;get&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;model.get(attribute)&lt;/em&gt;&lt;/p&gt;&#xD;
&lt;p&gt;获取model的指定attribute的当前值，如&lt;em&gt;note.get('title')&lt;/em&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;set&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;model.set(attributes, [options])&lt;/em&gt;&lt;/p&gt;&#xD;
&lt;p&gt;给model设置一个或多个attribute，如果有attribute的值改变了model的状态，&lt;em&gt;change&lt;/em&gt;事件将被触发，除非你通过&lt;em&gt;options&lt;/em&gt;参数设置了&lt;em&gt;{silent:tru}&lt;/em&gt;。特定attribute的change事件也会触发，所以你只关心特定属性的变化的话，可以只订阅特定的事件，如&lt;em&gt;chagne:title&lt;/em&gt;或&lt;em&gt;change:content&lt;/em&gt;&lt;/p&gt;&#xD;
&lt;div id="highlighter_264603" &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;note.set({title: "October 12", content: "Lorem Ipsum Dolor Sit Amet..."});&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;如果model定义了&lt;em&gt;validate&lt;/em&gt;方法，当调用set时会先调用该方法，如果验证失败，model的attributes将不会改变，并且&lt;em&gt;set&lt;/em&gt;方法会返回false。你可以通过options传递一个error的callback来捕获这种情况，你也可以订阅model的&lt;em&gt;error&lt;/em&gt;事件来统一捕获这种验证出错的情况。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;escapte&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;model.escape(attribute)&lt;/em&gt;&lt;/p&gt;&#xD;
&lt;p&gt;如果简单的使用&lt;em&gt;get&lt;/em&gt;,，则返回原始的attribute，如果你需要把取出的值插入到html里，为了防止&lt;a href="http://en.wikipedia.org/wiki/Cross-site_scripting" rel="nofollow"&gt;XSS&lt;/a&gt;攻击，你可以使用&lt;em&gt;escape&lt;/em&gt;&lt;/p&gt;&#xD;
&lt;div id="highlighter_663047" &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; hacker = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Backbone.Model({&lt;br /&gt;  name: "&amp;lt;script&amp;gt;alert('xss')&amp;lt;/script&amp;gt;"&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;alert(hacker.escape('name'));&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;has&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;model.has(attribute)&lt;/em&gt;&lt;/p&gt;&#xD;
&lt;p&gt;如果指定的attribute不为null也不会undefined的话返回true。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (note.has("title")) {&lt;br /&gt;  ...&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;unset&lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;model.unset(attribute, [options])&lt;/em&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在model内部的attributes键值对里删除指定的attribute，并且会触发change事件，除非通过options参数设置了silent。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;clear&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;model.clear([options])&lt;/em&gt;&lt;/p&gt;&#xD;
&lt;p&gt;移除model里的所有的attributes，并且会触发change事件，除非通过options设置了silent。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;id&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;model.id&lt;/em&gt;&lt;/p&gt;&#xD;
&lt;p&gt;model的一个特殊属性，它可以是任意一个字符串(整数或guid),如果你给model设置了id attribute，它会成为model的一个直接的属性(译注：不需要用get获取)。你可以通过id在&lt;em&gt;collections&lt;/em&gt;里查找Model，并且用它来生成model的默认URL(译注：就是model和api交互使用的RESTfull url)。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;cid&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;model.cid&lt;/em&gt;&lt;/p&gt;&#xD;
&lt;p&gt;model的一个特殊属性，它是在model第一次在创建时自动分配的一个唯一标示符。当model还没保存到服务器的时候，model还没有id属性，而这时候需要在UI上显示，所以需要一个client id，它们类似&lt;em&gt;c1,c2,c3 ...&lt;/em&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;attributes&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;model.attributes&lt;/em&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;attributes&lt;/em&gt;属性用来保存model的内部状态。请使用&lt;em&gt;set&lt;/em&gt;来修改它，而不要直接修改它。如果你要获取它，请使用&lt;em&gt;toJSON&lt;/em&gt;方法。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;defaults&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;model.defaults or model.defaults()&lt;/em&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;defaults&lt;/em&gt;哈希(或方法)可以给model指定默认的attributes。当创建model的实例时，没有设置的attribute将使用默认值。&lt;/p&gt;&#xD;
&lt;div id="highlighter_818739" &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; Meal = Backbone.Model.extend({&lt;br /&gt;  defaults: {&lt;br /&gt;    "appetizer":  "caesar salad",&lt;br /&gt;    "entree":     "ravioli",&lt;br /&gt;    "dessert":    "cheesecake"&lt;br /&gt;  }&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;alert("Dessert will be " + (&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Meal).get('dessert'));&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;em&gt;请记住，在javascript里，对象是通过引用传递的，所以包含在对象里的默认值，是所有实例共享的&lt;/em&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;toJSON&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;model.toJSON()&lt;/em&gt;&lt;/p&gt;&#xD;
&lt;p&gt;返回model.attributes的JSON对象副本。它可以用来进行持久化，序列化，或者在view处理model的数据时使用。这个名字不是太好，因为它不是返回一个JSON字符串，但你可以使用&lt;a href="https://developer.mozilla.org/en/JSON#toJSON(" rel="nofollow"&gt;JSON.stringify&lt;/a&gt;_method)来获取JSON字符串&lt;/p&gt;&#xD;
&lt;div id="highlighter_310478" &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; artist = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Backbone.Model({&lt;br /&gt;  firstName: "Wassily",&lt;br /&gt;  lastName: "Kandinsky"&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;artist.set({birthday: "December 16, 1866"});&lt;br /&gt;&lt;br /&gt;alert(JSON.stringify(artist));&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;fetch&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;model.fetch([options])&lt;/em&gt;&lt;/p&gt;&#xD;
&lt;p&gt;通过服务器来重置model的状态。常用于model里还没有任何数据时，或者要保持model里的数据始终是服务器端的最新版本。如果从服务器上拉下的数据和model当前的数据不一样，则会触发change事件。可以在options参数里使用&lt;em&gt;success&lt;/em&gt;和&lt;em&gt;error&lt;/em&gt;回调函数来处理fetch成功和失败的情况，这两个回调执行时会传入model和response参数。&lt;/p&gt;&#xD;
&lt;div id="highlighter_370748" &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Poll every 10 seconds to keep the channel model up-to-date.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;setInterval(&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;() {&lt;br /&gt;  channel.fetch();&lt;br /&gt;}, 10000);&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;save&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;mode.save([attributes],[options])&lt;/em&gt;&lt;/p&gt;&#xD;
&lt;p&gt;通过&lt;em&gt;Backbone.sync&lt;/em&gt;把model保存到数据库（或其它的持久层），如果提供了&lt;em&gt;attributes&lt;/em&gt;参数，则只保存这里提到的attribute，没提到的attribute不会更新。如果model包含&lt;em&gt;validate&lt;/em&gt;方法，且验证失败，那么model不会保存成功。如果model.&lt;em&gt;isNew&lt;/em&gt;为true，将会触发&lt;em&gt;create&lt;/em&gt;(HTTP POST),如果model已经在服务器存在(译注：model的id已经存在)，将触发&lt;em&gt;update&lt;/em&gt;(HTTP PUT)&lt;/p&gt;&#xD;
&lt;p&gt;下面这个例子演示了我们重写的&lt;em&gt;Backbone.sync&lt;/em&gt;在model第一次save的时候引发&lt;em&gt;create&lt;/em&gt;&amp;nbsp;method，而第二次save的时候引发&lt;em&gt;update&lt;/em&gt;&amp;nbsp;method.&lt;/p&gt;&#xD;
&lt;div id="highlighter_71215" &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;Backbone.sync = &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(method, model) {&lt;br /&gt;  alert(method + ": " + JSON.stringify(model));&lt;br /&gt;  model.id = 1;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; book = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Backbone.Model({&lt;br /&gt;  title: "The Rough Riders",&lt;br /&gt;  author: "Theodore Roosevelt"&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;book.save();&lt;br /&gt;&lt;br /&gt;book.save({author: "Teddy"});&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;save&lt;/strong&gt;的第二个options参数里可以设置&lt;em&gt;success&lt;/em&gt;和&lt;em&gt;error&lt;/em&gt;&amp;nbsp;callback来处理save成功和失败的情况,这两个callback会传入mode和response参数。如果model包含&lt;em&gt;validate&lt;/em&gt;且校验失败或服务端返回非200应答，或返回错误的text或JSON应答(译注：比如服务器返回的应答不能parse成JSON)。&lt;/p&gt;&#xD;
&lt;div id="highlighter_537816" &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;book.save({author: "F.D.R."}, {error: &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(){ ... }});&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;destroy&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;model.destroy([options])&lt;/em&gt;&amp;nbsp;通过&lt;em&gt;Backbone.sync&lt;/em&gt;在服务端销毁model，&lt;em&gt;options&lt;/em&gt;参数里可以接受success和error回调。destroy方法会触发model的&lt;em&gt;destroy&lt;/em&gt;事件，并且该事件向上冒泡给包含该model的&lt;em&gt;collections&lt;/em&gt;&lt;/p&gt;&#xD;
&lt;div id="highlighter_15108" &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;book.destroy({success: &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(model, response) {&lt;br /&gt;  ...&lt;br /&gt;}});&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;validate&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;model.validate(attributes)&lt;/em&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这是一个默认没定义的方法，我们鼓励你定义它来实现你的自定义验证逻辑。该方法会在调用&lt;em&gt;set&lt;/em&gt;和&lt;em&gt;save&lt;/em&gt;时执行，并传递要保存或设置的attributes进来。如果这些属性通过了验证，则该方法什么都不要返回，如果验证失败，则可以返回一个字符串或者一个对象（译注：会传道error事件的callback里）。如果验证出错，set和save将不会继续执行，并且会触发&lt;em&gt;error&lt;/em&gt;事件。&lt;/p&gt;&#xD;
&lt;div id="highlighter_139982" &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; Chapter = Backbone.Model.extend({&lt;br /&gt;  validate: &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(attrs) {&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (attrs.end &amp;lt; attrs.start) {&lt;br /&gt;      &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; "can't end before it starts";&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; one = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Chapter({&lt;br /&gt;  title : "Chapter One: The Beginning"&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;one.bind("error", &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(model, error) {&lt;br /&gt;  alert(model.get("title") + " " + error);&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;one.set({&lt;br /&gt;  start: 15,&lt;br /&gt;  end:   10&lt;br /&gt;});&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;em&gt;error&lt;/em&gt;事件可以进行比较粗粒度的错误处理，但如果你要再一个view里保存一个model时想显式的处理错误，则可以在save或set方法里直接指定error callback来处理错误及阻止&lt;em&gt;error&lt;/em&gt;事件触发。&lt;/p&gt;&#xD;
&lt;div id="highlighter_864564" &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;account.set({access: "unlimited"}, {&lt;br /&gt;  error: &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(model, error) {&lt;br /&gt;    alert(error);&lt;br /&gt;  }&lt;br /&gt;});&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;url&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;model.url()&lt;/em&gt;&lt;/p&gt;&#xD;
&lt;p&gt;返回model在服务器端对应的资源的相对url。如果你的model不用Backbone自动生成的url进行同步，则覆盖该方法实现你自己的逻辑。默认情况下，如果model在collection里，生成的url如&lt;em&gt;/[collection.url]/[model.id]&lt;/em&gt;，如果model不在collections里，则生成的url如&lt;em&gt;/[urlRoot]/model.id&lt;/em&gt;&lt;/p&gt;&#xD;
&lt;p&gt;要通过Collection.url来生成url，确保你定义了它。或者定义&lt;em&gt;urlRoot&lt;/em&gt;属性，则所有该model的实例都共享该属性。如果model的id是101，且它所在的&lt;em&gt;Backbone.Collection&lt;/em&gt;的url是&lt;em&gt;/document/7/notes&lt;/em&gt;,将会生成&lt;em&gt;/documents/7/notes/101&lt;/em&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;urlRoot&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;model.urlRoot&lt;/em&gt;&lt;/p&gt;&#xD;
&lt;p&gt;如果model不在collection里的话，指定&lt;em&gt;urlRoot&lt;/em&gt;来让默认的&lt;em&gt;url&lt;/em&gt;方法能够生成类似&lt;em&gt;/[/urlRoot]/id&lt;/em&gt;这样的url.&lt;/p&gt;&#xD;
&lt;div id="highlighter_542365" &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; Book = Backbone.Model.extend({urlRoot : '/books'});&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; solaris = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Book({id: "1083-lem-solaris"});&lt;br /&gt;&lt;br /&gt;alert(solaris.url());&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;parse&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;model.parse(response)&lt;/em&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;parse&lt;/em&gt;在&lt;em&gt;fetch&lt;/em&gt;和&lt;em&gt;save&lt;/em&gt;时服务端返回数据时调用，该方法传入原始的response对象，你需要返回attribute键值对给model的set方法。该方法默认的实现不做任何操作，简单的返回JSON应答。如果你已经存在一个现有的API不符合model所需要的数据格式，可以覆盖该方法用自定义的逻辑对返回的数据进行转换。（译注：如果要用现有的API，你甚至可以在model里定义sync方法来完全定义特定model的CRUD行为）&lt;/p&gt;&#xD;
&lt;p&gt;(译注：这里略了一些ror的文字)&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;clone&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;model.clone()&lt;/em&gt;&lt;/p&gt;&#xD;
&lt;p&gt;返回具有相同attributes的model实例。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;isNew&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;mode.isNew()&lt;/em&gt;&lt;/p&gt;&#xD;
&lt;p&gt;指示该model是否保存到服务端，如果model还没有id属性，则认为它还没保存到服务端。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;change&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;model.change()&lt;/em&gt;&lt;/p&gt;&#xD;
&lt;p&gt;手工触发&lt;em&gt;change&lt;/em&gt;事件，如果你之前在set的时候设置了silent:true来阻止触发change事件，你可以在这样多次set后，调用一次change方法来引发一次change事件。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;hasChanged&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;model.hasChanged([attribute])&lt;/em&gt;&lt;/p&gt;&#xD;
&lt;p&gt;上次触发change事件后model是否进行了变化，如果指定了attribute，则表示该attribute是否进行了变化。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;请注意，此方法一般在如下情况下使用，就是在change的回调里去查看指定的attribute是否发生了变化&lt;/em&gt;&lt;/p&gt;&#xD;
&lt;div id="highlighter_628754" &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;book.bind("change", &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;() {&lt;br /&gt;  &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (book.hasChanged("title")) {&lt;br /&gt;    ...&lt;br /&gt;  }&lt;br /&gt;});&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;changeAttributes&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;model.changeAttributes([attributes])&lt;/em&gt;&lt;/p&gt;&#xD;
&lt;p&gt;返回model里进行了变化的attributes，如果指定了attributes参数则返回这些指定的attribute里变化的attribute。这可以得到哪些属性将修改到服务器，以及选择性的向服务器同步数据。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;previous&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;model.previous(attribute)&lt;/em&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在&lt;em&gt;change&lt;/em&gt;事件回调里，它可以访问指定attribute的旧的值。&lt;/p&gt;&#xD;
&lt;div id="highlighter_891013" &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; bill = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Backbone.Model({&lt;br /&gt;  name: "Bill Smith"&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;bill.bind("change:name", &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(model, name) {&lt;br /&gt;  alert("Changed name from " + bill.previous("name") + " to " + name);&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;bill.set({name : "Bill Jones"});&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;previousAttributes&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;model.previousAttributes()&lt;/em&gt;&lt;/p&gt;&#xD;
&lt;p&gt;返回model的变化前的attributes副本，他一般用来比较model的多个版本之间的区别，以及在发生错误的时候把attributes回滚到以前的版本。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/onlytiancai/aggbug/2283452.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/onlytiancai/archive/2011/12/10/backbone.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/onlytiancai/archive/2011/12/03/2274479.html</id><title type="text">蛙蛙推荐：gevent并发发送UDP包演示</title><summary type="text">gevent是一个非常棒的python异步IO库，一般的示例都是用他来做高并发的tcp server，其实它也能很好的工作在udp上，而且超时，并发数都能很好的控制。</summary><published>2011-12-03T02:18:00Z</published><updated>2011-12-03T02:18:00Z</updated><author><name>蛙蛙王子</name><uri>http://www.cnblogs.com/onlytiancai/</uri></author><link rel="alternate" href="http://www.cnblogs.com/onlytiancai/archive/2011/12/03/2274479.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/onlytiancai/archive/2011/12/03/2274479.html"/><content type="html">&lt;p&gt;gevent是一个非常棒的python异步IO库，一般的示例都是用他来做高并发的tcp server，其实它也能很好的工作在udp上，而且超时，并发数都能很好的控制。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;!/usr/bin/env python&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;-*- coding:utf8 -*-&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;import&lt;/span&gt; DNS &lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;http://pydns.sourceforge.net/&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;from&lt;/span&gt; gevent &lt;span style="color: #0000ff;"&gt;import&lt;/span&gt; spawn, joinall,socket,sleep&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;from&lt;/span&gt; gevent.coros &lt;span style="color: #0000ff;"&gt;import&lt;/span&gt; BoundedSemaphore&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;from&lt;/span&gt; datetime &lt;span style="color: #0000ff;"&gt;import&lt;/span&gt; datetime&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;import&lt;/span&gt; random&lt;br /&gt;&lt;br /&gt;DNS.ParseResolvConf()&lt;br /&gt;SERVER = (DNS.defaults[&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;server&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;][0],53)&lt;br /&gt;SERVER = (&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;8.8.8.8&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;,53) &lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;临时使用google的dns&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;TIMEOUT = 10 &lt;br /&gt;lock = BoundedSemaphore(50) &lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;并发数限制，防止同时pending的请求太多&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;statis = {} &lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;统计信息&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;def&lt;/span&gt; log(domain,status,responsetime):&lt;br /&gt;    statis.setdefault(status, 0)&lt;br /&gt;    statis[status] += 1&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;print&lt;/span&gt; &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;%s %s %s&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; % (domain, status, responsetime)&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;def&lt;/span&gt; getreq(domain, qtype):&lt;br /&gt;    &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;根据域名和查询类型得到dns请求的字节流&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;br /&gt;    m = DNS.Lib.Mpacker()&lt;br /&gt;    m.addHeader(id=random.randint(0,65535),&lt;br /&gt;        qr=0,&lt;br /&gt;        opcode=0,&lt;br /&gt;        aa=0,&lt;br /&gt;        tc=0,&lt;br /&gt;        rd=1,&lt;br /&gt;        ra=0,&lt;br /&gt;        z=0,&lt;br /&gt;        rcode=0,&lt;br /&gt;        qdcount=1,&lt;br /&gt;        ancount=0,&lt;br /&gt;        nscount=0,&lt;br /&gt;        arcount=0)&lt;br /&gt;    m.addQuestion(domain, qtype, DNS.Class.IN)&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; m.getbuf()&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;def&lt;/span&gt; monitorone(domain): &lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;try&lt;/span&gt;:&lt;br /&gt;        lock.acquire()&lt;br /&gt;&lt;br /&gt;        start = datetime.now()&lt;br /&gt;        client = socket.socket(&lt;br /&gt;                family=socket.AF_INET, &lt;br /&gt;                type=socket.SOCK_DGRAM,&lt;br /&gt;                proto=socket.IPPROTO_UDP)&lt;br /&gt;        client.settimeout(TIMEOUT)&lt;br /&gt;&lt;br /&gt;        req = getreq(domain, DNS.Type.MX) &lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;封包&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        client.sendto(req, SERVER) &lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;发包&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        (rsp, (ip, port)) = client.recvfrom(512) &lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;收包&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        u = DNS.Lib.Munpacker(rsp) &lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;解包&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        rsp = DNS.Lib.DnsResult(u, {})&lt;br /&gt;&lt;br /&gt;        end = datetime.now()&lt;br /&gt;        responsetime = (end - start).microseconds&lt;br /&gt;        log(domain, rsp.header[&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;status&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;], responsetime)&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;except&lt;/span&gt; Exception, ex:&lt;br /&gt;        log(domain, ex.message, 0)&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;finally&lt;/span&gt;:&lt;br /&gt;        lock.release()&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;加载域名列表并解析&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;list = [spawn(monitorone, domain.strip()) &lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; domain &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; open(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;./domains.txt&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;)]&lt;br /&gt;joinall(list) &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;global&lt;/span&gt; statis&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;print&lt;/span&gt; statis&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;以上代码是从一个文本里加载一个域名列表，然后以50并发的速度去google dns查询DNS应答，记录应答状态码和响应时间。&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/onlytiancai/aggbug/2274479.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/onlytiancai/archive/2011/12/03/2274479.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/onlytiancai/archive/2011/07/30/2122182.html</id><title type="text">蛙蛙推荐：sqlserver三种分页方式性能比较</title><summary type="text">三种分页效率的比较</summary><published>2011-07-30T12:50:00Z</published><updated>2011-07-30T12:50:00Z</updated><author><name>蛙蛙王子</name><uri>http://www.cnblogs.com/onlytiancai/</uri></author><link rel="alternate" href="http://www.cnblogs.com/onlytiancai/archive/2011/07/30/2122182.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/onlytiancai/archive/2011/07/30/2122182.html"/><content type="html">&lt;p&gt;Liwu_Items表，CreateTime列建立聚集索引&lt;/p&gt;&#xD;
&lt;p&gt;第一种，sqlserver2005特有的分页语法&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;declare&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;@page&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;declare&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;@pagesize&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;@page&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;@pagesize&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;12&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;SET&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;STATISTICS&lt;/span&gt;&lt;span style="color: #000000;"&gt; IO &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;on&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;SELECT&lt;/span&gt;&lt;span style="color: #000000;"&gt;  a.&lt;/span&gt;&lt;span style="color: #808080;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;FROM&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;SELECT&lt;/span&gt;&lt;span style="color: #000000;"&gt; ROW_NUMBER() &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;OVER&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;ORDER&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;BY&lt;/span&gt;&lt;span style="color: #000000;"&gt; b.CreateTime &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;DESC&lt;/span&gt;&lt;span style="color: #000000;"&gt;) &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;AS&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;ROW_NUMBER&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;&lt;span style="color: #000000;"&gt;, b.&lt;/span&gt;&lt;span style="color: #808080;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;br /&gt;   &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;FROM&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;dbo&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Liwu_Items&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;AS&lt;/span&gt;&lt;span style="color: #000000;"&gt; b   ) &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;AS&lt;/span&gt;&lt;span style="color: #000000;"&gt; a&lt;br /&gt;   &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;WHERE&lt;/span&gt;&lt;span style="color: #000000;"&gt; a.&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;ROW_NUMBER&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;BETWEEN&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;@pagesize&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;AND&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #008000;"&gt;@page&lt;/span&gt;&lt;span style="color: #808080;"&gt;*&lt;/span&gt;&lt;span style="color: #008000;"&gt;@pagesize&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;   &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;ORDER&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;BY&lt;/span&gt;&lt;span style="color: #000000;"&gt; a.&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;ROW_NUMBER&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;结果：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;12&lt;/span&gt;&lt;span style="color: #000000;"&gt; 行受影响)&lt;br /&gt;表 &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;'&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Liwu_Items&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;。扫描计数 &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;，逻辑读取 &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;7&lt;/span&gt;&lt;span style="color: #000000;"&gt; 次，物理读取 &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; 次，预读 &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; 次，lob 逻辑读取 &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; 次，lob 物理读取 &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; 次，lob 预读 &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; 次。&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;逻辑读是7次&lt;/p&gt;&#xD;
&lt;p&gt;执行计划：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/8814/2011073020434546.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;主要开销都在聚集索引扫描了。&lt;/p&gt;&#xD;
&lt;p&gt;第二种，用两个top分别正序和倒序排列，共另个子查询来实现分页，&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;declare&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;@page&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;declare&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;@pagesize&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;@page&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;@pagesize&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;12&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;SET&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;STATISTICS&lt;/span&gt;&lt;span style="color: #000000;"&gt; IO &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;on&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;select&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;from&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;select&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;top&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #008000;"&gt;@pagesize&lt;/span&gt;&lt;span style="color: #000000;"&gt;) &lt;/span&gt;&lt;span style="color: #808080;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;from&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;br /&gt;        (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;select&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;top&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #008000;"&gt;@page&lt;/span&gt;&lt;span style="color: #808080;"&gt;*&lt;/span&gt;&lt;span style="color: #008000;"&gt;@pagesize&lt;/span&gt;&lt;span style="color: #000000;"&gt;) &lt;/span&gt;&lt;span style="color: #808080;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;from&lt;/span&gt;&lt;span style="color: #000000;"&gt; Liwu_Items &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;order&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;by&lt;/span&gt;&lt;span style="color: #000000;"&gt; CreateTime &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;desc&lt;/span&gt;&lt;span style="color: #000000;"&gt;) a&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;order&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;by&lt;/span&gt;&lt;span style="color: #000000;"&gt; CreateTime &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;asc&lt;/span&gt;&lt;span style="color: #000000;"&gt;) b &lt;br /&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;order&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;by&lt;/span&gt;&lt;span style="color: #000000;"&gt; CreateTime &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;desc&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;结果&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;12&lt;/span&gt;&lt;span style="color: #000000;"&gt; 行受影响)&lt;br /&gt;表 &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;'&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Liwu_Items&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;。扫描计数 &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;，逻辑读取 &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;7&lt;/span&gt;&lt;span style="color: #000000;"&gt; 次，物理读取 &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; 次，预读 &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;317&lt;/span&gt;&lt;span style="color: #000000;"&gt; 次，lob 逻辑读取 &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; 次，lob 物理读取 &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; 次，lob 预读 &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; 次。&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;执行计划&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/8814/2011073020453981.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;执行计划和第一种差不多，但两个排序占的资源挺多的。&lt;/p&gt;&#xD;
&lt;p&gt;第三种，最垃圾的一种，用not in字句实现的，如下&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;declare&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;@page&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;declare&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;@pagesize&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;@page&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;@pagesize&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;12&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;SET&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;STATISTICS&lt;/span&gt;&lt;span style="color: #000000;"&gt; IO &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;on&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;select&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;top&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #008000;"&gt;@pagesize&lt;/span&gt;&lt;span style="color: #000000;"&gt;) &lt;/span&gt;&lt;span style="color: #808080;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;from&lt;/span&gt;&lt;span style="color: #000000;"&gt; Liwu_Items&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;where&lt;/span&gt;&lt;span style="color: #000000;"&gt; ItemId &lt;/span&gt;&lt;span style="color: #808080;"&gt;not&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt;(    &lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;select&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;top&lt;/span&gt;&lt;span style="color: #000000;"&gt;((&lt;/span&gt;&lt;span style="color: #008000;"&gt;@page&lt;/span&gt;&lt;span style="color: #808080;"&gt;-&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #808080;"&gt;*&lt;/span&gt;&lt;span style="color: #008000;"&gt;@pagesize&lt;/span&gt;&lt;span style="color: #000000;"&gt;) ItemId &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;from&lt;/span&gt;&lt;span style="color: #000000;"&gt; Liwu_Items &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;order&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;by&lt;/span&gt;&lt;span style="color: #000000;"&gt; CreateTime &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;desc&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;order&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;by&lt;/span&gt;&lt;span style="color: #000000;"&gt; CreateTime &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;Desc&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;结果&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;12&lt;/span&gt;&lt;span style="color: #000000;"&gt; 行受影响)&lt;br /&gt;表 &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;'&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Worktable&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;。扫描计数 &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;，逻辑读取 &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;70&lt;/span&gt;&lt;span style="color: #000000;"&gt; 次，物理读取 &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; 次，预读 &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; 次，lob 逻辑读取 &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; 次，lob 物理读取 &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; 次，lob 预读 &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; 次。&lt;br /&gt;表 &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;'&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Liwu_Items&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;。扫描计数 &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;，逻辑读取 &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;18&lt;/span&gt;&lt;span style="color: #000000;"&gt; 次，物理读取 &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; 次，预读 &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; 次，lob 逻辑读取 &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; 次，lob 物理读取 &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; 次，lob 预读 &lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; 次。&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;性能最差，对两个表进行处理，逻辑读都很高，汗。&lt;/p&gt;&#xD;
&lt;p&gt;执行计划&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/8814/2011073020485114.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这执行计划都看不懂，嵌套循环和表假脱机占了很大的资源。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;总结:第二种分页方法和第一种分页方法效率差不多，但第二种可用于老版本的sqlserver甚至access，最后一种别用。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/onlytiancai/aggbug/2122182.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/onlytiancai/archive/2011/07/30/2122182.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/onlytiancai/archive/2011/07/30/oledbhelper.html</id><title type="text">蛙蛙推荐：神马ORM都是浮云，看看史上最简单最好用的OleDbHelper</title><summary type="text">摘要：大多数据库都支持OleDb，OleDb的参数化查询不支持命名参数，参数用?表示就行，赋值是按顺序赋值的。今天把Sqlserver迁移到Access，顺手写了个简单的OleDbHelper，由于OleDb的通用性，应该也可以访问其它的数据库，而且参数化查询也不怕sql注入，性能应该也会太差。</summary><published>2011-07-30T10:55:00Z</published><updated>2011-07-30T10:55:00Z</updated><author><name>蛙蛙王子</name><uri>http://www.cnblogs.com/onlytiancai/</uri></author><link rel="alternate" href="http://www.cnblogs.com/onlytiancai/archive/2011/07/30/oledbhelper.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/onlytiancai/archive/2011/07/30/oledbhelper.html"/><content type="html">&lt;p&gt;摘要：大多数据库都支持OleDb，OleDb的参数化查询不支持命名参数，参数用?表示就行，赋值是按顺序赋值的。今天把Sqlserver迁移到Access，顺手写了个简单的OleDbHelper，由于OleDb的通用性，应该也可以访问其它的数据库，而且参数化查询也不怕sql注入，性能应该也会太差。&lt;/p&gt;&#xD;
&lt;p&gt;以下为完整代码，不到50行&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #008080;"&gt; 1&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; OledbHelper&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 2&lt;/span&gt; &lt;span style="color: #000000;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 3&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; _strconn;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; OledbHelper(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; strconn)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 5&lt;/span&gt; &lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 6&lt;/span&gt; &lt;span style="color: #000000;"&gt;        _strconn &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; strconn;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; T ExecuteScalar&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; sql, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;params&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt;[] args)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 9&lt;/span&gt; &lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; (OleDbConnection conn &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; OleDbConnection(_strconn))&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt; &lt;span style="color: #000000;"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; (T)MakeCommand(conn, sql, args).ExecuteScalar();                &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt; &lt;span style="color: #000000;"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;14&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;15&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; ExecuteNonQuery(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; sql, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;params&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt;[] args)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;16&lt;/span&gt; &lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;17&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; (OleDbConnection conn &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; OleDbConnection(_strconn))&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;18&lt;/span&gt; &lt;span style="color: #000000;"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;19&lt;/span&gt; &lt;span style="color: #000000;"&gt;            MakeCommand(conn, sql, args).ExecuteNonQuery();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;20&lt;/span&gt; &lt;span style="color: #000000;"&gt;        }          &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;21&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;22&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; IDataReader ExecuteReader(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; sql, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;params&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt;[] args)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;23&lt;/span&gt; &lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;24&lt;/span&gt; &lt;span style="color: #000000;"&gt;        OleDbConnection conn &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; OleDbConnection(_strconn);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;25&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;try&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;26&lt;/span&gt; &lt;span style="color: #000000;"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;27&lt;/span&gt; &lt;span style="color: #000000;"&gt;            OleDbCommand cmd &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; MakeCommand(conn, sql, args);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;28&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; cmd.ExecuteReader(CommandBehavior.CloseConnection);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;29&lt;/span&gt; &lt;span style="color: #000000;"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;30&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;catch&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;31&lt;/span&gt; &lt;span style="color: #000000;"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;32&lt;/span&gt; &lt;span style="color: #000000;"&gt;            conn.Close();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;33&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;throw&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;34&lt;/span&gt; &lt;span style="color: #000000;"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;35&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;36&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; OleDbCommand MakeCommand(OleDbConnection conn, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; sql, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;params&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt;[] args)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;37&lt;/span&gt; &lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;38&lt;/span&gt; &lt;span style="color: #000000;"&gt;        OleDbCommand cmd &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; OleDbCommand(sql, conn);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;39&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (conn.State &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; ConnectionState.Open)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;40&lt;/span&gt; &lt;span style="color: #000000;"&gt;            conn.Open();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;41&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; i &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;; i &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; args.Length; i&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;42&lt;/span&gt; &lt;span style="color: #000000;"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;43&lt;/span&gt; &lt;span style="color: #000000;"&gt;            cmd.Parameters.AddWithValue(i.ToString(), args[i]);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;44&lt;/span&gt; &lt;span style="color: #000000;"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;45&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; cmd;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;46&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;47&lt;/span&gt; &lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;使用示例&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;获取单个值&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; GetTagName(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;&lt;span style="color: #000000;"&gt; tagid)&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; _db.ExecuteScalar&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;select TagName from Liwu_Tags where TagId=?&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, tagid);&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;普通查询，参数的赋值很自然简单，代码最终也很简短&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;需要注意的是access的"日期/时间"列不能用DateTime类型赋值，要ToString一下，如下&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; AddTags(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;long&lt;/span&gt;&lt;span style="color: #000000;"&gt; itemid, IEnumerable&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; tagids)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt;&lt;span style="color: #000000;"&gt; (var tagid &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; tagids)&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #000000;"&gt;_db.ExecuteReader(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;select * from Liwu_TagLines where ItemId=? and TagId=?&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, itemid, tagid).Read())&lt;br /&gt;        {&lt;br /&gt;            _db.ExecuteNonQuery(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;insert into Liwu_TagLines values (?,?,?)&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br /&gt;                tagid, itemid, DateTime.Now.ToString(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;yyyy-MM-dd hh:mm:ss&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;));&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;带条件的分页查询，性能还行，查询出来的DataReader可以直接去绑定数据控件去&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;分页sql有些长，所以代码有些乱，好在修改的地方不太多&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; IDataReader GetItems(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; page &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; tagid &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; pagesize &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;12&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; sql1 &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;.Empty;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (tagid &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;        sql1 &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;.Format(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;select top {0} * from Liwu_Items order by CreateTime desc&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, page &lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; pagesize);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;        sql1 &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;.Format(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;select top {0} item.* from Liwu_Items as item inner join Liwu_TagLines as line&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt; on line.ItemId = item.ItemId  where tagid= ? order by item.CreateTime desc&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, pagesize &lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; page);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; sql2 &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;.Format(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;select top {0} * from ({1}) order by CreateTime&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, pagesize, sql1);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; sql &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;.Format(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;select * from ({0}) order by CreateTime desc&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, sql2);&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; tagid &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;?&lt;/span&gt;&lt;span style="color: #000000;"&gt; _db.ExecuteReader(sql) : _db.ExecuteReader(sql, tagid);&lt;br /&gt;}&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/onlytiancai/aggbug/2122130.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/onlytiancai/archive/2011/07/30/oledbhelper.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/onlytiancai/archive/2011/07/09/2101736.html</id><title type="text">蛙蛙推荐：用javascript作一个通用向导</title><summary type="text">摘要：向导可以让你的网站用户快速上手使用你的web应用，提高网站的吸引力。向导一般分为好几个步骤，每个步骤收集一些数据，并且支持退回功能，所有步骤完成后可以得到每一步的收集结果。这里给大家展示一种比较通用，灵活且简单的向导框架。</summary><published>2011-07-09T04:48:00Z</published><updated>2011-07-09T04:48:00Z</updated><author><name>蛙蛙王子</name><uri>http://www.cnblogs.com/onlytiancai/</uri></author><link rel="alternate" href="http://www.cnblogs.com/onlytiancai/archive/2011/07/09/2101736.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/onlytiancai/archive/2011/07/09/2101736.html"/><content type="html">&lt;p&gt;摘要：向导可以让你的网站用户快速上手使用你的web应用，提高网站的吸引力。向导一般分为好几个步骤，每个步骤收集一些数据，并且支持退回功能，所有步骤完成后可以得到每一步的收集结果。这里给大家展示一种比较通用，灵活且简单的向导框架。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;1、界面设计&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;index.html:只提供了一个向导显示位置的占位符&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;html&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;head&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;title&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;礼物推荐向导&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;title&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;meta &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;http-equiv&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="content-type"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; content&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="text/html; charset=utf-8"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;link &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;rel&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="stylesheet"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; type&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="text/css"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; href&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="style.css"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;script &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;src&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="jquery.js"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; type&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="text/javascript"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;script&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;script &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;src&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="wizard.js"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; type&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="text/javascript"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;script&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;head&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;body&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;div &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="wizard"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;body&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;html&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;style.css:默认情况下向导里有一个h2呈现的标题，一个ul呈现的主要内容，一个div呈现的按钮条，我们简单设计了一下他们的默认外观，实际应用中大家可以自由的美化它们。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #800000;"&gt;body&lt;/span&gt;&lt;span style="color: #000000;"&gt;{&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    margin&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;   &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;span style="color: #800000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;向导容器&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #800000;"&gt;&lt;br /&gt;#wizard&lt;/span&gt;&lt;span style="color: #000000;"&gt;{&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    height&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;400px&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    width&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;600px&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    background-color&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;#999&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;span style="color: #800000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;向导的主体内容，用列表展示&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #800000;"&gt;&lt;br /&gt;#wizard ul&lt;/span&gt;&lt;span style="color: #000000;"&gt;{&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    margin&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;10px&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    height&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;80%&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;span style="color: #800000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;横向显示列表内容&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #800000;"&gt;&lt;br /&gt;#wizard li&lt;/span&gt;&lt;span style="color: #000000;"&gt;{&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    display&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;inline-block&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    margin&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;10px&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    cursor&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;pointer&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;span style="color: #800000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;列表的标题&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #800000;"&gt;&lt;br /&gt;#wizard h2&lt;/span&gt;&lt;span style="color: #000000;"&gt;{&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    margin&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;10px&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;span style="color: #800000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;列表的功能条，如返回按钮&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #800000;"&gt;&lt;br /&gt;#wizard .bar&lt;/span&gt;&lt;span style="color: #000000;"&gt;{&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    margin&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;10px&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;    clear&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;both&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 21px; font-weight: bold; line-height: 31px;"&gt;2、准备每一步骤&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;向导可以分为每一步骤，每个步骤需要呈现内容，捕捉用户选择，提供标题等功能，我们让每一步都自己负责自己的事情，但要符合我们规定的一些契约。&lt;/p&gt;&#xD;
&lt;p&gt;每一个步骤用一个函数表示，第一个参数data_key是选择本步骤数据的关键字，一般用于上一个步骤的结果决定下一个步骤显示数据的情况，第二个参数result_callback是个回调函数，就是在本步骤获取结果时调用，它用于和向导类进行通信，向导类在得到上一步的结果后存储结果并跳向到下一步。&lt;/p&gt;&#xD;
&lt;p&gt;该函数返回一个二元组，第一个元素是本步骤的标题，第二个元素是本步骤主体部分的UI。&lt;/p&gt;&#xD;
&lt;p&gt;我们的示例是一个礼物推荐系统，共分三步，第一步选择送礼对象，第二步选择关键字，其中第一步的选择结果会影响到第二步显示，第三步选择价格区间，如下就是代码的实现，其中绘制界面和事件捕捉用了jquery来简化操作。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; step1(data_key, result_callback){&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; targets &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; [&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;女朋友&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;男朋友&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;父亲&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;妈妈&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;孩子&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;];&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; warpper &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; $(&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;ul&amp;gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;    $.each(targets, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(k,v){&lt;br /&gt;        $(&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;v&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;).click(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(){result_callback(v)}).appendTo(warpper);&lt;br /&gt;    });&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; [&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;第一步:请选择送礼物的对象&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,warpper];&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; step2(data_key, result_callback){&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; tags &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;女朋友&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;:[&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;创意&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;可爱&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;浪漫&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;激情&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;实用&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;数码&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;自制&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;毛绒玩具&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;衣服&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;包包&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;],&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;男朋友&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;:[&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;男士用品&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;温馨&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;实用&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;数码&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;创意&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;衣物&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;],&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;父亲&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;  :[&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;男士用品&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;健康&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;植物&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;衣物&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;],&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;妈妈&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;  :[&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;温馨&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;健康&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;创意&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;护肤品&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;实用&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;],&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;孩子&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;  :[&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;玩具&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;学习用品&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;实用&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;数码&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;]&lt;br /&gt;    };&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; warpper &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; $(&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;ul&amp;gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;    $.each(tags[data_key], &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(k,v){&lt;br /&gt;        $(&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;v&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;).click(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(){result_callback(v)}).appendTo(warpper);&lt;br /&gt;    });&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; [&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;第二步:请选择关键词&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,warpper];   &lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; step3(data_key, result_callback){&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; price_level &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; [&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;便宜&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;普通&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;稍贵&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;贵重&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;];&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; warpper &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; $(&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;ul&amp;gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;    $.each(price_level, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(k,v){&lt;br /&gt;        $(&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;v&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;).click(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(){result_callback(v)}).appendTo(warpper);&lt;br /&gt;    });&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; [&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;第三步:请选择价格区间&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,warpper];&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 21px; font-weight: bold; line-height: 31px;"&gt;3、向导类的实现&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;向导类要设置向导所在的DOM元素，要执行的步骤列表，向导完成后执行的回调，向导还应该提供上一步和下一步的方法，所以我们用一个类来表示向导，在构造函数里传入DOM容器，步骤列表和回调函数，用prototype给类增加三个方法。render用来呈现某一步骤的UI，并在本步骤收集结果的回调里推向下一步，如果本步骤是最后一步，则调用向导执行完成的回调函数。&lt;/p&gt;&#xD;
&lt;p&gt;另外两个next和back函数分别是执行上一个步骤和下一个步骤，这两个函数实用index的私有变量来维持整个向导的状态&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; Wizard(container, steps, callback){&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.container &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; container; &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;向导容器&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.steps &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; steps;         &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;向导步骤&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.callback &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; callback;   &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;向导执行完毕执行的回调&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.collect_data &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; [];     &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;保存向导每一步骤的结果&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.index &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;当前执行在那一步骤&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;绘制某一步骤&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Wizard.prototype.render &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(step, this_result){&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; me &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;执行该步骤并得到该步骤的UI&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; to_append &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; step(this_result,&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(result){&lt;br /&gt;        me.collect_data.push(result); &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;收集本步骤结果&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;向导执行完毕时调用回调函数，否则执行下一步&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(me.collect_data.length &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; me.steps.length) &lt;br /&gt;            me.callback(me.collect_data);&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;            me.next(result);&lt;br /&gt;    });&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;绘制本步骤的UI&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.container.empty();&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.container.append(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;to_append[&lt;/span&gt;&lt;span style="color: #000000;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;]&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.container.append(to_append[&lt;/span&gt;&lt;span style="color: #000000;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;]); &lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.index &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;){&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;后退按钮&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.container.append($(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;div class='bar'&amp;gt;&amp;lt;a href='javascript:;'&amp;gt;后退&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;            .click(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(){me.back()}&lt;br /&gt;                ));&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;执行下一步&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Wizard.prototype.next &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(this_result){&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.index &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.steps.length &lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; step &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.steps[&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.index];&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.render(step,this_result);&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;后退到上一步&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Wizard.prototype.back &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(){&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.index &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; step &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.steps[&lt;/span&gt;&lt;span style="color: #000000;"&gt;--&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.index];&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;步骤回到上一步，但上一步的数据需要上上一步的结果来决定&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.collect_data &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.collect_data.slice(&lt;/span&gt;&lt;span style="color: #000000;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.index);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.render(step, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.collect_data[&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.index &lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;]);&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;4、小结&lt;/p&gt;&#xD;
&lt;p&gt;本向导结构简单，可定制性强，结合了javascript的函数式编程特性和面向对象的特性，体现了javascript的强大和便利。&lt;/p&gt;&#xD;
&lt;p&gt;其中wizard类里界面绘制的部分和步骤函数里界面绘制的部分还是存在一些耦合，继续重构的话，可以把所有绘制界面的部分再抽象到一起，使界面改动更方便。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/onlytiancai/aggbug/2101736.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/onlytiancai/archive/2011/07/09/2101736.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/onlytiancai/archive/2011/07/07/2099833.html</id><title type="text">蛙蛙推荐：写了一个简单的延迟队列</title><summary type="text">写了一个简单的延迟队列，用于处理短时大量请求的情况，可以设置队列处理Handler，每次取队列的时间间隔，以及每次取多少队列项进行处理。队列处理是同步执行。public class LazyQueue&amp;lt;T&amp;gt;{ public LazyQueue(Action&amp;lt;T&amp;gt; handler, int inteval, int onecount) { _handler = handler; _inteval = inteval; _onecount = onecount; _t = new Thread(ThreadProc); _t.Name = &amp;quot;LazyQueue&amp;q</summary><published>2011-07-07T02:47:00Z</published><updated>2011-07-07T02:47:00Z</updated><author><name>蛙蛙王子</name><uri>http://www.cnblogs.com/onlytiancai/</uri></author><link rel="alternate" href="http://www.cnblogs.com/onlytiancai/archive/2011/07/07/2099833.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/onlytiancai/archive/2011/07/07/2099833.html"/><content type="html">&lt;p&gt;写了一个简单的延迟队列，用于处理短时大量请求的情况，可以设置队列处理Handler，每次取队列的时间间隔，以及每次取多少队列项进行处理。&lt;/p&gt;&#xD;
&lt;p&gt;队列处理是同步执行。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; LazyQueue&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; LazyQueue(Action&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; handler, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; inteval, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; onecount)&lt;br /&gt;    {&lt;br /&gt;        _handler &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; handler;&lt;br /&gt;        _inteval &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; inteval;&lt;br /&gt;        _onecount &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; onecount;&lt;br /&gt;        _t &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Thread(ThreadProc);&lt;br /&gt;        _t.Name &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;LazyQueue&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;        _t.IsBackground &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    }&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; EnQueue(T item)&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;lock&lt;/span&gt;&lt;span style="color: #000000;"&gt; (_queue)&lt;br /&gt;        {&lt;br /&gt;            _queue.Enqueue(item);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Start()&lt;br /&gt;    {&lt;br /&gt;        _t.Start();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; ThreadProc(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; state)&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;try&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;            {&lt;br /&gt;                List&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; tempItems &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; List&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(_onecount);&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;lock&lt;/span&gt;&lt;span style="color: #000000;"&gt; (_queue)&lt;br /&gt;                {&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; i &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; _onecount &lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;; i &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;; i&lt;/span&gt;&lt;span style="color: #000000;"&gt;--&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;                    {&lt;br /&gt;                        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (_queue.Count &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;                        {&lt;br /&gt;                            tempItems.Add(_queue.Dequeue());&lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;                tempItems.ForEach(_handler);&lt;br /&gt;&lt;br /&gt;            }&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;catch&lt;/span&gt;&lt;span style="color: #000000;"&gt; (Exception ex)&lt;br /&gt;            {&lt;br /&gt;                System.Diagnostics.Trace.TraceError(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;ThreadProc error:{0}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, ex);&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            Thread.Sleep(_inteval);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; Queue&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; _queue &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Queue&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;();&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; Action&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; _handler &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; _inteval &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; _onecount &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; Thread _t &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&lt;img src="http://www.cnblogs.com/onlytiancai/aggbug/2099833.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/onlytiancai/archive/2011/07/07/2099833.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/onlytiancai/archive/2011/06/07/2074135.html</id><title type="text">蛙蛙推荐：javascript异步任务流</title><summary type="text">如下一些任务，每个任务都是异步执行的，因为它们都要去网络上取一些数据，而且不知道什么时间能执行完成。function output(msg){ $(&amp;quot;#debug&amp;quot;).append(&amp;quot;&amp;lt;p&amp;gt;&amp;quot;+msg+&amp;quot;&amp;lt;/p&amp;gt;&amp;quot;);}function work1(callback){ output(&amp;quot;begin work1&amp;quot;); $.get(&amp;#39;data.js&amp;#39;, function(data){ output(&amp;quot;end work1&amp;quot;); if(typeof callbac</summary><published>2011-06-07T03:05:00Z</published><updated>2011-06-07T03:05:00Z</updated><author><name>蛙蛙王子</name><uri>http://www.cnblogs.com/onlytiancai/</uri></author><link rel="alternate" href="http://www.cnblogs.com/onlytiancai/archive/2011/06/07/2074135.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/onlytiancai/archive/2011/06/07/2074135.html"/><content type="html">&lt;p&gt;如下一些任务，每个任务都是异步执行的，因为它们都要去网络上取一些数据，而且不知道什么时间能执行完成。&lt;/p&gt;&#xD;
&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; output(msg){&lt;br /&gt;    $(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;#debug&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;).append(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;msg&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; work1(callback){&lt;br /&gt;    output(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;begin work1&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;    $.get(&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;data.js&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(data){&lt;br /&gt;        output(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;end work1&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;&lt;span style="color: #000000;"&gt; callback &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;){&lt;br /&gt;            callback();&lt;br /&gt;        }&lt;br /&gt;    });&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; work2(callback){&lt;br /&gt;    output(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;begin work2&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;    $.get(&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;data.js&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(data){&lt;br /&gt;        output(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;end work2&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;&lt;span style="color: #000000;"&gt; callback &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;){&lt;br /&gt;            callback();&lt;br /&gt;        }&lt;br /&gt;    });&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; work3(callback){&lt;br /&gt;    output(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;begin work3&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;    $.get(&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;data.js&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(data){&lt;br /&gt;        output(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;end work3&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;&lt;span style="color: #000000;"&gt; callback &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;){&lt;br /&gt;            callback();&lt;br /&gt;        }&lt;br /&gt;    });&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;如果我们同步调用这些任务，&lt;/p&gt;&#xD;
&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;work1();&lt;br /&gt;work2();&lt;br /&gt;work3();&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;br /&gt;&#xD;
&#xD;
&lt;p&gt;会出现如下结果&lt;/p&gt;&#xD;
&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;begin work1&lt;br /&gt;begin work2&lt;br /&gt;begin work3&lt;br /&gt;end work1&lt;br /&gt;end work2&lt;br /&gt;end work3&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;但我们想第一个任务完成后再执行第二个任务，依次类推，如果不借助异步框架的支持，我们就需要修改work1,work2,work3的代码，让他们完成后执行相应的后续任务,这样以后要修改任务流就需要改动具体任务的代码，变化点比较分散。&lt;/p&gt;&#xD;
&lt;p&gt;也可以在开始执行任务前准备一些回调函数，然后再开始，这样封装了变化点，提高了代码的可读性，大致如下&lt;/p&gt;&#xD;
&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; callback3 &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(){work3();};&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; callback2 &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(){work2(callback3);};&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; callback1 &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(){work1(callback2);}&lt;br /&gt;callback1();&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;执行结果如下&lt;/p&gt;&#xD;
&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;begin work1&lt;br /&gt;end work1&lt;br /&gt;begin work2&lt;br /&gt;end work2&lt;br /&gt;begin work3&lt;br /&gt;end work3&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;可以看到这段代码虽然执行结果符合预期，但可读性和可维护性太差了，一大串匿名函数，而且写的顺序还得仔细注意，所以我写了个小框架了让它变的简单。&lt;/p&gt;&#xD;
&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; AsyncWorkManager(){&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.works &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; [];&lt;br /&gt;}&lt;br /&gt;AsyncWorkManager.prototype.addWork &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(callee, caller){&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;&lt;span style="color: #000000;"&gt; callee&lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;throw&lt;/span&gt;&lt;span style="color: #000000;"&gt; {name:&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;TypeError&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,message:&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;work must be a function&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;};&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.works.push([callee, caller]);&lt;br /&gt;};&lt;br /&gt;AsyncWorkManager.prototype.start &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(){  &lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; me &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; arr &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; [];&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; j &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; i &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.works.length &lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;;i &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;; i&lt;/span&gt;&lt;span style="color: #000000;"&gt;--&lt;/span&gt;&lt;span style="color: #000000;"&gt;){&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; fun &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(){&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; work &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; me.works[j&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;];&lt;br /&gt;            work[&lt;/span&gt;&lt;span style="color: #000000;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;].call(work[&lt;/span&gt;&lt;span style="color: #000000;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;],arr.pop());&lt;br /&gt;        };&lt;br /&gt;        arr.push(fun);&lt;br /&gt;    }&lt;br /&gt;    arr.pop()();&lt;br /&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;代码很少，但效果很好，再次写调度代码就简单了，如下。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; manager &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; AsyncWorkManager();&lt;br /&gt;manager.addWork(work1);&lt;br /&gt;manager.addWork(work2);&lt;br /&gt;manager.addWork(work3);&lt;br /&gt;manager.start();&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;img src="http://www.cnblogs.com/onlytiancai/aggbug/2074135.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/onlytiancai/archive/2011/06/07/2074135.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/onlytiancai/archive/2011/04/23/2025728.html</id><title type="text">蛙蛙推荐：css背景图片固定居中，div阴影，背景半透明，div圆角，DIV渐变</title><summary type="text">很久不更新博客，整理了CSS的一些常用效果，尽量兼容多的浏览器，包括背景图片固定居中，div阴影，背景半透明，div圆角，DIV渐变等。&amp;lt;html&amp;gt;&amp;lt;head&amp;gt; &amp;lt;meta http-equiv=&amp;quot;Content-Type&amp;quot; content=&amp;quot;text/html; charset=utf-8&amp;quot; /&amp;gt; &amp;lt;title&amp;gt;CSS test&amp;lt;/title&amp;gt; &amp;lt;style type=&amp;quot;text/css&amp;quot;&amp;gt; body { margin: 0; /*背景图片固定居中 http:/</summary><published>2011-04-23T08:38:00Z</published><updated>2011-04-23T08:38:00Z</updated><author><name>蛙蛙王子</name><uri>http://www.cnblogs.com/onlytiancai/</uri></author><link rel="alternate" href="http://www.cnblogs.com/onlytiancai/archive/2011/04/23/2025728.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/onlytiancai/archive/2011/04/23/2025728.html"/><content type="html">&lt;p&gt;很久不更新博客，整理了CSS的一些常用效果，尽量兼容多的浏览器，包括背景图片固定居中，div阴影，背景半透明，div圆角，DIV渐变等。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;html&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;head&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;meta &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;http-equiv&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Content-Type"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; content&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="text/html; charset=utf-8"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;title&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;CSS test&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;title&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;style &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="text/css"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #800000;"&gt;&lt;br /&gt;        body&lt;br /&gt;        &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;{&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt;&lt;br /&gt;            margin&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt; 0&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt; &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;背景图片固定居中&lt;br /&gt;            http://www.w3school.com.cn/css/pr_background-position.asp&lt;br /&gt;            http://www.198484.com/?action=show&amp;amp;id=51&lt;br /&gt;            &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt;&lt;br /&gt;            background-image&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt; url('images/bg1.jpg')&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt;&lt;br /&gt;            background-attachment&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt; fixed&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt;&lt;br /&gt;            background-position&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt; center&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt;&lt;br /&gt;            background-repeat&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt; no-repeat&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;}&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #800000;"&gt;&lt;br /&gt;        #header&lt;br /&gt;        &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;{&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;}&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #800000;"&gt;&lt;br /&gt;        #inner-header&lt;br /&gt;        &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;{&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt;&lt;br /&gt;            margin&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt; 0 auto&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt;&lt;br /&gt;            width&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt; 960px&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt;&lt;br /&gt;            background-color&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt; Gray&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt;&lt;br /&gt;            height&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt; 80px&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt; &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;布局块阴影，如果不想支持低版本IE可去掉滤镜&lt;br /&gt;            http://blog.imbolo.com/cross-browsers-css-shadow/&lt;br /&gt;            &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt;&lt;br /&gt;            box-shadow&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt; 3px 3px 4px #000&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt;&lt;br /&gt;            -moz-box-shadow&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt; 3px 3px 4px #000&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt;&lt;br /&gt;            -webkit-box-shadow&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt; 3px 3px 4px #000&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt;&lt;br /&gt;            filter&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt; progid:DXImageTransform.Microsoft.Shadow(Strength=4, Direction=135, Color='#000000')&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt;&lt;br /&gt;            -ms-filter&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt; "progid:DXImageTransform.Microsoft.Shadow(Strength=4, Direction=135, Color='#000000')"&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;}&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #800000;"&gt;&lt;br /&gt;        #main&lt;br /&gt;        &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;{&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt;&lt;br /&gt;            background-color&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt; Gray&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt;&lt;br /&gt;            margin&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt; 10 auto&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt;&lt;br /&gt;            width&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt; 960px&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt;&lt;br /&gt;            min-height&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt; 500px&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt;&lt;br /&gt;            height&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt; auto&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt; &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;&lt;br /&gt;            背景半透明&lt;br /&gt;            http://blog.csdn.net/zenwong/archive/2008/08/29/2846546.aspx&lt;br /&gt;            &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt;&lt;br /&gt;            filter&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt; alpha(opacity=70)&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt; &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;IE&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt;&lt;br /&gt;            -moz-opacity&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt; 0.7&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt; &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;Mozilla&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt;&lt;br /&gt;            opacity&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt; 0.7&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt; &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;FF&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt; &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;&lt;br /&gt;            圆角效果，不考虑低版本IE&lt;br /&gt;            http://blog.imbolo.com/creating-rounded-corners-with-css/&lt;br /&gt;            &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt;&lt;br /&gt;            -moz-border-radius&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt; 20px&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt;&lt;br /&gt;            -webkit-border-radius&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt; 20px&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt;&lt;br /&gt;            border-radius&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt; 20px&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;}&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #800000;"&gt;&lt;br /&gt;        #footer&lt;br /&gt;        &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;{&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt;&lt;br /&gt;            margin&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt; 0 auto&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt;&lt;br /&gt;            width&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt; 960px&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt;&lt;br /&gt;            height&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt; 100px&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt; &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;渐变效果&lt;br /&gt;            http://www.zhangxinxu.com/wordpress/?p=743&lt;br /&gt;            &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt;&lt;br /&gt;            filter&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt; alpha(opacity=100 finishopacity=50 style=1 startx=0,starty=0,finishx=0,finishy=150) progid:DXImageTransform.Microsoft.gradient(startcolorstr=red,endcolorstr=blue,gradientType=0)&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt;&lt;br /&gt;            -ms-filter&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt; alpha(opacity=100 finishopacity=50 style=1 startx=0,starty=0,finishx=0,finishy=150) progid:DXImageTransform.Microsoft.gradient(startcolorstr=red,endcolorstr=blue,gradientType=0)&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt; &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;IE8&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt;&lt;br /&gt;            background-color&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt; Gray&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt; &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt; 一些不支持背景渐变的浏览器 &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt;&lt;br /&gt;            background&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt; -moz-linear-gradient(top, red, rgba(0, 0, 255, 0.5))&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt;&lt;br /&gt;            background&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt; -webkit-gradient(linear, 0 0, 0 bottom, from(#ff0000), to(rgba(0, 0, 255, 0.5)))&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt;&lt;br /&gt;            background&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt; -o-linear-gradient(top, red, rgba(0, 0, 255, 0.5))&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;}&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #800000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;style&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: #008000;"&gt;[if IE]&amp;gt;&lt;br /&gt;    &amp;lt;style type="text/css"&amp;gt;&lt;br /&gt;        #main&lt;br /&gt;        {&lt;br /&gt;            height: 500px;&lt;br /&gt;        }&lt;br /&gt;        body&lt;br /&gt;        {&lt;br /&gt;            text-align:center;&lt;br /&gt;        }&lt;br /&gt;        #inner-header&lt;br /&gt;        {&lt;br /&gt;        text-align:left;&lt;br /&gt;        }&lt;br /&gt;    &amp;lt;/style&amp;gt;&lt;br /&gt;    &amp;lt;![endif]&lt;/span&gt;&lt;span style="color: #008000;"&gt;--&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;head&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;body&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;div &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="header"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;div &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="inner-header"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;h1&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;                CSS Demo&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;h1&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;div &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="main"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;div &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="footer"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;body&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;html&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/p&gt;&lt;img src="http://www.cnblogs.com/onlytiancai/aggbug/2025728.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/onlytiancai/archive/2011/04/23/2025728.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/onlytiancai/archive/2011/03/05/1971912.html</id><title type="text">蛙蛙推荐：用.net 4.0构建新浪微博开发平台应用</title><summary type="text">现在很多互联网应用都推出了开放平台，开心，人人，新浪，淘宝，豆瓣，腾讯，还有飞信也即将推出开放平台，大多数开发平台都会用OAuth认证，并提供返回json数据的Rest接口，用.NET 4.0的新特性来开发这些平台的应用有着天然的优势，一起来看看。</summary><published>2011-03-05T15:13:00Z</published><updated>2011-03-05T15:13:00Z</updated><author><name>蛙蛙王子</name><uri>http://www.cnblogs.com/onlytiancai/</uri></author><link rel="alternate" href="http://www.cnblogs.com/onlytiancai/archive/2011/03/05/1971912.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/onlytiancai/archive/2011/03/05/1971912.html"/><content type="html">&lt;p&gt;摘要：现在很多互联网应用都推出了开放平台，&lt;a href="http://www.kaixin001.com/platform/"&gt;开心&lt;/a&gt;，&lt;a href="http://dev.renren.com/"&gt;人人&lt;/a&gt;，&lt;a href="http://open.t.sina.com.cn/"&gt;新浪&lt;/a&gt;，&lt;a href="http://open.taobao.com/"&gt;淘宝&lt;/a&gt;，&lt;a href="http://www.douban.com/service/"&gt;豆瓣&lt;/a&gt;，&lt;a href="http://opensns.qq.com/"&gt;腾讯&lt;/a&gt;，还有&lt;a href="http://tech.163.com/11/0224/09/6TL9PSGU000915BE.html"&gt;飞信也即将推出开放平台&lt;/a&gt;，大多数开发平台都会用OAuth认证，并提供返回&lt;a href="http://baike.baidu.com/view/136475.htm"&gt;json&lt;/a&gt;数据的&lt;a href="http://baike.baidu.com/view/1077487.htm"&gt;Rest&lt;/a&gt;接口，用.NET 4.0的新特性来开发这些平台的应用有着天然的优势，一起来看看。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;认证&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;要想使用开发平台的数据和接口，第一步肯定是登录和认证，&lt;a href="http://baike.baidu.com/view/3948029.htm"&gt;OAuth&lt;/a&gt;被越来越多的开放平台所认可和使用，&lt;a href="http://terrylee.me/blog/"&gt;TerryLee&lt;/a&gt;已经介绍过在&lt;a href="在.NET中实现OAuth身份认证"&gt;.NET里如何实现OAuth认证&lt;/a&gt;，不过是针对豆瓣平台的一些示例代码，新浪微博的OAuth认证有一些不同的地方,一会儿我会标识出来。&lt;a href="http://t.sina.com.cn/1653426785"&gt;sarlmolapple&lt;/a&gt;为新浪提供了新浪微博开放平台的&lt;a href="http://code.google.com/p/opensinaapi/"&gt;c#版本SDK&lt;/a&gt;，但没有完全对新浪微博的所有接口进行支持。因此我借鉴了两位的代码写了个针对新浪微博的精简版的OAuth认证，因为简单，如果大家想开发其它开放平台的应用，也可以很快比猫画虎做出来。&lt;/p&gt;&#xD;
&lt;p&gt;首先还是要下载别人写好的&lt;a href="http://oauth.googlecode.com/svn/code/csharp/"&gt;OAuthBase.cs&lt;/a&gt;文件，然后继承该类写一些自定义的逻辑，后来发现只通过子类来实现自定义逻辑还不好使，所以迫不得已还是修改了OAuthBase.cs类，因为新浪微博开放平台要求生成OAuth签名时，多了一个Verifier参数，所以在生成basestring时（GenerateSignatureBase方法）要加上这个参数。&lt;/p&gt;&#xD;
&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;NOTE:add by onlytiancai@gmail.com 兼容sina登录,参考了http:&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;code.google.com/p/opensinaapi/&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;.IsNullOrEmpty(Verifier) &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; httpMethod &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;GET&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;{&lt;br /&gt;    parameters.Add(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; QueryParameter(oAauthVerifier, Verifier));&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;准备一下OAuth认证的配置项，这些配置项大家可以在数据库里配置或者写个自定义配置节在Web.config里配置，为了简单，我就先写死了，如下&lt;/p&gt;&#xD;
&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; OAuthConfig&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; OAuthConfig Instance &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; OAuthConfig();&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; OAuthConfig()&lt;br /&gt;    {&lt;br /&gt;        RequestTokenUri &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;http://api.t.sina.com.cn/oauth/request_token&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;        AuthorizeUri &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;http://api.t.sina.com.cn/oauth/authorize&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;        AccessTokenUri &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;http://api.t.sina.com.cn/oauth/access_token&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;        ApiKey &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;xxxx&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;在新浪微博开放平台申请&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        ApiKeySecret &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;xxxxxxxxxxxxxxxxxx&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;在新浪微博开放平台申请&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    }&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; RequestTokenUri { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; ApiKey { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; ApiKeySecret { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; AuthorizeUri { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; AccessTokenUri { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;请求open api接口时一般要拼写PostData格式的数据，而PostData的格式是类似"?p1=a&amp;amp;p2=b&amp;amp;p3=c"，这种格式，要手动拼写这样格式的字符串很麻烦，所以我们想要一种优雅的方式，比如&lt;/p&gt;&#xD;
&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;get_request(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; {p1&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;a&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, p2&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;b&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, p3&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;c&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;})&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;br /&gt;&#xD;
&#xD;
&lt;p&gt;这个参数是一个c# 3.5的匿名类，然后在get_request方法里可以通过反射获取到属性名和值，构建成PostData格式，但这样做性能会稍差一些，我们可以用另外一种相近的格式，如下&lt;/p&gt;&#xD;
&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;get_request(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Pairs { { &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;p1&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;a&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; }, {&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;p2&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;b&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;}, &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;p3&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;c&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; } )&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;这里的参数是一个Pairs类，后面的大括号套着大括号是.net 3.5的集合初始化语法，这个Pairs是我在(&lt;a href="http://weblogs.asp.net/leftslipper/archive/2007/09/24/using-c-3-0-anonymous-types-as-dictionaries.aspx"&gt;Using C# 3.0 Anonymous Types as Dictionaries&lt;/a&gt; )这篇博客的评论里看到的，我略微修改了一下，如下&lt;/p&gt;&#xD;
&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; Pairs : List&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;KeyValuePair&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;String, String&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Add(String key, String value)&lt;br /&gt;    {&lt;br /&gt;        Add(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; KeyValuePair&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(key, value));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; ToPostData(Func&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; valueHandler &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;    {&lt;br /&gt;        StringBuilder sb &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; StringBuilder();&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt;&lt;span style="color: #000000;"&gt; (var pair &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (sb.Length &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;                sb.Append(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;            sb.AppendFormat(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;{0}={1}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, pair.Key, valueHandler &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #000000;"&gt;?&lt;/span&gt;&lt;span style="color: #000000;"&gt; pair.Value : valueHandler(pair.Value));&lt;br /&gt;        }&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; sb.ToString();&lt;br /&gt;    }&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;我只增加了一个ToPostData的方法，其中有一个可选的参数用来在拼接PostData时对参数值进行处理，可选参宿是.net 4.0提供的机制，如果不提供这个参数，我就按原文拼写参数值&lt;/p&gt;&#xD;
&lt;p&gt;我继承OAuthBase写了一个OAuthHelper类，其中OAuthRequest方法用来发送一个OAuth请求，如下&lt;/p&gt;&#xD;
&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; OAuthRequest(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; uri, Pairs data &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; method &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;GET&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;1、准备获取签名所需参数&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; nonce &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; GenerateNonce();&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; timeStamp &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; GenerateTimeStamp();&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (data &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;        data &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Pairs();&lt;br /&gt;    data.Add(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;source&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, OAuthConfig.Instance.ApiKey); &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;添加默认的source参数&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    uri &lt;/span&gt;&lt;span style="color: #000000;"&gt;+=&lt;/span&gt;&lt;span style="color: #000000;"&gt; uri.IndexOf(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;?&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;) &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;?&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; : &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;?&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    uri &lt;/span&gt;&lt;span style="color: #000000;"&gt;+=&lt;/span&gt;&lt;span style="color: #000000;"&gt; data.ToPostData(str &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; UrlEncode(str)); &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;防止参数里有",%,="等字符&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;2、获取签名&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; normalizeUrl, normalizedRequestParameters;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; sig &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; GenerateSignature(&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Uri(uri),&lt;br /&gt;        OAuthConfig.Instance.ApiKey,&lt;br /&gt;        OAuthConfig.Instance.ApiKeySecret,&lt;br /&gt;        Token,&lt;br /&gt;        TokenSecret,&lt;br /&gt;        method,&lt;br /&gt;        timeStamp,&lt;br /&gt;        nonce,&lt;br /&gt;        OAuthBase.SignatureTypes.HMACSHA1,&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;out&lt;/span&gt;&lt;span style="color: #000000;"&gt; normalizeUrl,&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;out&lt;/span&gt;&lt;span style="color: #000000;"&gt; normalizedRequestParameters);&lt;br /&gt;    normalizedRequestParameters &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; normalizedRequestParameters &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; OAuthSignatureKey &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;=&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; HttpUtility.UrlEncode(sig);&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;3、发送WEB请求并接受数据&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    HttpWebRequest request &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; (HttpWebRequest)WebRequest.Create(&lt;br /&gt;        method &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;POST&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;?&lt;/span&gt;&lt;span style="color: #000000;"&gt; normalizeUrl : normalizeUrl &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;?&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; normalizedRequestParameters);&lt;br /&gt;    request.Method &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; method;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (method &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;POST&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; (StreamWriter sw &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; StreamWriter(request.GetRequestStream()))&lt;br /&gt;        {&lt;br /&gt;            sw.Write(normalizedRequestParameters);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; (HttpWebResponse response &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; (HttpWebResponse)request.GetResponse())&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; (StreamReader reader &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; StreamReader(request.GetResponse()&lt;br /&gt;            .GetResponseStream(), System.Text.Encoding.UTF8))&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; reader.ReadToEnd();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;具体步骤我都做了注释，其中GenerateNonce，GenerateTimeStamp，UrlEncode，GenerateSignature都是父类提供的方法，直接调用即可，根据名字也很容易想出它的功能，如果你做的不是新浪微博开放平台的应用，这里可能要相应的做一些小改动。&lt;/p&gt;&#xD;
&lt;p&gt;然后是进行OAuth的三步认证，第一步获取RequestToken，第二步让用户进行授权，一般情况下会提示用户登录新浪微博或者提示用户授权或拒绝授权你的应用访问用户的新浪微博数据，第三步就是拿到AccessToken去访问受限的资源，具体过程大家可以看&lt;a href="http://open.t.sina.com.cn/wiki/index.php/Oauth"&gt;这里&lt;/a&gt;。有了上面我们写的方法，这三步就很简单了。&lt;/p&gt;&#xD;
&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 登录第一步：获取RequestToken&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; GetRequestToken()&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; response &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; OAuthRequest(OAuthConfig.Instance.RequestTokenUri);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (response.Length &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;    {&lt;br /&gt;        NameValueCollection qs &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; HttpUtility.ParseQueryString(response);&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (qs[OAuthTokenKey] &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.Token &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; qs[OAuthTokenKey];&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.TokenSecret &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; qs[OAuthTokenSecretKey];&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 登录第二部：Response.Redirect到这个页面，提示用户授权&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="callbackUri"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;用户认证成功后返回的地址&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; GetAuthorizeUri(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; callbackUri)&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;.Format(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;{0}?oauth_token={1}&amp;amp;&amp;amp;oauth_callback={2}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br /&gt;        OAuthConfig.Instance.AuthorizeUri,&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.Token, callbackUri);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 登录第三部：获取AccessToken，成功登录&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; GetAccessToken()&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; response &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; OAuthRequest(OAuthConfig.Instance.AccessTokenUri);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (response.Length &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;    {&lt;br /&gt;        NameValueCollection qs &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; HttpUtility.ParseQueryString(response);&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (qs[OAuthTokenKey] &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.Token &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; qs[OAuthTokenKey];&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.TokenSecret &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; qs[OAuthTokenSecretKey];&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;其中Token和TokenSecret是OAuthHelper的两个string类型成员。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;获取JSON数据&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;一般开放平台的接口可以返回xml格式或JSON格式的数据，如果解析XML数据会很不通用，每一个接口需要写一个方法，而返回json的话.NET 4.0提供的JavaScriptSerializer可以对json数据进行序列化和反序列化，json格式的数据可以反序列化成Dictionary&amp;lt;string, object&amp;gt;类型或其类型的数组，其中object又是一个Dictionary&amp;lt;string, object&amp;gt;，但我们对Dictionary的操作会很麻烦，我们想办法吧它转换成一个c# 4.0的dynamic类型，这里有篇帖子（&lt;a href="http://coderjournal.com/2010/07/turning-json-into-a-expandoobject/"&gt;Turning JSON into a ExpandoObject&lt;/a&gt; &amp;nbsp;&amp;nbsp;）介绍了如何去做，我在此基础上改动了一下，并提供了一个直接把open api返回的数据转换成ExpandoObject的方法，如下。&lt;/p&gt;&#xD;
&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 发送OAuth请求，并把返回的json结果转换成dynamic类型&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="uri"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;请求地址，请确保返回json数据&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="data"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;请求数据&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="method"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;HttpMethod&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; ExpandoObject OAuthRequestDynamic(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; uri, Pairs data &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; method &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;GET&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; result &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; OAuthRequest(uri, data, method);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (result &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; Expando(result);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; ExpandoObject Expando(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; json)&lt;br /&gt;{&lt;br /&gt;    JavaScriptSerializer serializer &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; JavaScriptSerializer();&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; obj &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; serializer.DeserializeObject(json);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (obj &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;is&lt;/span&gt;&lt;span style="color: #000000;"&gt; ICollection)&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; Expando(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Dictionary&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;() { { &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;arr&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, obj } });&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; Expando((Dictionary&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;)obj);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000; text-decoration: underline;"&gt;http://coderjournal.com/2010/07/turning-json-into-a-expandoobject/&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; ExpandoObject Expando(IDictionary&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; dictionary)&lt;br /&gt;{&lt;br /&gt;    var expando &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; ExpandoObject();&lt;br /&gt;    var expandoDic &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; (IDictionary&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;)expando;&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt;&lt;span style="color: #000000;"&gt; (var item &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; dictionary)&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; alreadyProcessed &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (item.Value &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;is&lt;/span&gt;&lt;span style="color: #000000;"&gt; IDictionary&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;        {&lt;br /&gt;            expandoDic.Add(item.Key, Expando((IDictionary&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;)item.Value));&lt;br /&gt;            alreadyProcessed &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;        }&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (item.Value &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;is&lt;/span&gt;&lt;span style="color: #000000;"&gt; ICollection)&lt;br /&gt;        {&lt;br /&gt;            var itemList &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; List&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;();&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt;&lt;span style="color: #000000;"&gt; (var item2 &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; (ICollection)item.Value)&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (item2 &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;is&lt;/span&gt;&lt;span style="color: #000000;"&gt; IDictionary&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;                    itemList.Add(Expando((IDictionary&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;)item2));&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;                    itemList.Add(Expando(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Dictionary&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; { { &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Unknown&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, item2 } }));&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (itemList.Count &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;            {&lt;br /&gt;                expandoDic.Add(item.Key, itemList);&lt;br /&gt;                alreadyProcessed &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #000000;"&gt;alreadyProcessed)&lt;br /&gt;            expandoDic.Add(item);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; expando;&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;这下可好了，访问opan api，直接返回的就是带类型的了，省了解析的工序了，和Python差不多，直接写出成员就行。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;开发第一个应用&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;去新浪微博开放平台注册一个账户，得到app key和app key secret，然后就可以开发测试应用了，新建一个Default.aspx页，摆放如下控件。&lt;/p&gt;&#xD;
&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;asp:Button &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;ID&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="btnLogin"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; runat&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="server"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; Text&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="登录"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; OnClick&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="btnLogin_Click"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;asp:Button &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;ID&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="btnTimeline"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; runat&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="server"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; OnClick&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="btnTimeline_Click"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; Text&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="timeline"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;asp:Label &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;ID&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="lblMessage"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; runat&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="server"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; Text&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="未登录"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;asp:Label&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;asp:Repeater &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;ID&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="rpt1"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; runat&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="server"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;ItemTemplate&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;               &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;img &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;src&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="&amp;lt;%# Eval("&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;user.profile_image_url") %&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;" alt="" /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;　　　　　　　　 &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;b&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background-color: #ffff00; color: #000000;"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;# &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;Eval&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;(&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #800000;"&gt;"&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #800000;"&gt;user.name&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #800000;"&gt;"&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;) &lt;/span&gt;&lt;span style="background-color: #ffff00; color: #000000;"&gt;%&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;b&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background-color: #ffff00; color: #000000;"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;# &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;Eval&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;(&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #800000;"&gt;"&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #800000;"&gt;text&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #800000;"&gt;"&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;)&lt;/span&gt;&lt;span style="background-color: #ffff00; color: #000000;"&gt;%&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="background-color: #ffff00; color: #000000;"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;# &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;Eval&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;(&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #800000;"&gt;"&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #800000;"&gt;created_at&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #800000;"&gt;"&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;)&lt;/span&gt;&lt;span style="background-color: #ffff00; color: #000000;"&gt;%&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;ItemTemplate&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;asp:Repeater&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;控件的功能根据名字可以推测出来，先看登录&lt;/p&gt;&#xD;
&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; btnLogin_Click(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;    OAuthHelper oauth &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; OAuthHelper();&lt;br /&gt;    oauth.GetRequestToken();&lt;br /&gt;    Session[&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;oauth_token&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;] &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; oauth.Token;&lt;br /&gt;    Session[&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;oauth_token_secret&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;] &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; oauth.TokenSecret;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; url &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; oauth.GetAuthorizeUri(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;http://localhost:1812/&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;    Response.Redirect(url);&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;先获取RequestToken，然后获取用户认证页地址，重定向过去，提示用户登录，用户登录完了之后会返回到calback uri，这里填写是本页，新浪会在返回的页面上提供oauth_verifier参数，如果有这个参数就说明是用户登录成功返回的，所以我们要在Page_Load里做一些处理，困了，就不写那么多说明了，大家看看，大多都是借鉴了&lt;a href="http://t.sina.com.cn/1653426785"&gt;sarlmolapple&lt;/a&gt;的示例代码。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Page_Load(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; sender, EventArgs e)&lt;br /&gt;  {&lt;br /&gt;      Session[Guid.NewGuid().ToString()] &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;生成cookie里的sessionid，防止Redirect回来丢失Session&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #000000;"&gt;Page.IsPostBack)&lt;br /&gt;      {&lt;br /&gt;          OAuthHelper oauth &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; OAuthHelper();&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (Request[&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;oauth_verifier&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;] &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;          {&lt;br /&gt;              oauth.Token &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; Session[&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;oauth_token&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;].ToString();&lt;br /&gt;              oauth.TokenSecret &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; Session[&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;oauth_token_secret&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;].ToString();&lt;br /&gt;              oauth.Verifier &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; Request[&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;oauth_verifier&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;];&lt;br /&gt;              oauth.GetAccessToken();&lt;br /&gt;              Session[&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;oauth_token&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;] &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; oauth.Token; ;&lt;br /&gt;              Session[&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;oauth_token_secret&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;] &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; oauth.TokenSecret;&lt;br /&gt;&lt;br /&gt;              Response.Redirect(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;/Default.aspx&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;          }&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (Session[&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;oauth_token&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;] &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;          {&lt;br /&gt;              &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.lblMessage.Text &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;登录成功&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;              &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.btnLogin.Visible &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;              &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.btnTimeline.Visible &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;          }&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;          {&lt;br /&gt;              &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.lblMessage.Text &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;未登录&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;              &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.btnLogin.Visible &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;              &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.btnTimeline.Visible &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;          }&lt;br /&gt;      }&lt;br /&gt;  }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;登录成功后，我们获取&lt;a href="http://open.t.sina.com.cn/wiki/index.php/Statuses/public_timeline"&gt;public_timeline&lt;/a&gt;，并直接绑定在Repeater上，不做任何解析，你猜能不能用。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; btnTimeline_Click(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;    OAuthHelper oauth &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; OAuthHelper();&lt;br /&gt;    oauth.Token &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; Session[&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;oauth_token&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;].ToString();&lt;br /&gt;    oauth.TokenSecret &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; Session[&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;oauth_token_secret&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;].ToString();&lt;br /&gt;    dynamic json &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; oauth.OAuthRequestDynamic(&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;　　　　"&lt;/span&gt;&lt;span style="color: #800000;"&gt;http://api.t.sina.com.cn/statuses/public_timeline.json&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Pairs { { &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;count&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;5&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; } });&lt;br /&gt;    rpt1.DataSource &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; json.arr;&lt;br /&gt;    rpt1.DataBind();&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;猜对了，不能用，但是加上如下代码就能用了&lt;/p&gt;&#xD;
&lt;p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; Eval(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; expression)&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;[] arr &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; expression.Split(&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;.&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; obj &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.Page.GetDataItem();&lt;br /&gt;    IDictionary&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; items &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; obj &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;as&lt;/span&gt;&lt;span style="color: #000000;"&gt; IDictionary&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (items &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (arr.Length &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; items[arr[&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;]];&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (arr.Length &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; ((IDictionary&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;)items[arr[&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;]])[arr[&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;]];&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;throw&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; NotSupportedException(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;哥，表达式too长了,不支持呀。&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;    }&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; DataBinder.Eval(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.Page.GetDataItem(), expression);&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;以上代码是在网上找到的一段，出处忘了，我在它的基础上修改了一下，支持了json的二级数据的绑定,可以直接在Eval里写&amp;ldquo;user.name&amp;rdquo;这样的表达式。&lt;/p&gt;&#xD;
&lt;p&gt;public_timeline返回的json样子大概是如下&lt;/p&gt;&#xD;
&lt;p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;[&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;created_at&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; : &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;Tue Nov 30 14:34:35 +0800 2010&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;text&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; : &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;吃力不讨好的事情我是坚决不会再做了，RI你个仙人！发飙~~~~我只想说档次和素质在那里去了，&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;　　　　　　你也就只能在这种地方混！&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;truncated&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; : &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;in_reply_to_status_id&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; : &lt;/span&gt;&lt;span style="color: #000000;"&gt;""&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;annotations&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; : &lt;br /&gt;        [&lt;br /&gt;&lt;br /&gt;        ],&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;in_reply_to_screen_name&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; : &lt;/span&gt;&lt;span style="color: #000000;"&gt;""&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;geo&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; : &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;user&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; : &lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;name&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; : &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;习惯寂寞吗&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;domain&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; : &lt;/span&gt;&lt;span style="color: #000000;"&gt;""&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;geo_enabled&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; : &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;followers_count&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; : &lt;/span&gt;&lt;span style="color: #000000;"&gt;5&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;statuses_count&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; : &lt;/span&gt;&lt;span style="color: #000000;"&gt;61&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;favourites_count&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; : &lt;/span&gt;&lt;span style="color: #000000;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;city&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; : &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;description&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; : &lt;/span&gt;&lt;span style="color: #000000;"&gt;""&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;verified&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; : &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;id&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; : &lt;/span&gt;&lt;span style="color: #000000;"&gt;1676792942&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;gender&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; : &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;f&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;friends_count&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; : &lt;/span&gt;&lt;span style="color: #000000;"&gt;26&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;screen_name&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; : &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;习惯寂寞吗&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;allow_all_act_msg&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; : &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;following&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; : &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;url&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; : &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;http://1&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;profile_image_url&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; : &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;http://tp3.sinaimg.cn/1676792942/50/1284648784&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;created_at&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; : &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;Wed Dec 30 00:00:00 +0800 2009&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;province&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; : &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;51&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;location&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; : &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;四川 成都&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;        },&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;favorited&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; : &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;in_reply_to_user_id&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; : &lt;/span&gt;&lt;span style="color: #000000;"&gt;""&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;id&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; : &lt;/span&gt;&lt;span style="color: #000000;"&gt;3978753419&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;source&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; : &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;a href=\"http://t.sina.com.cn\" rel=\"nofollow\"&amp;gt;新浪微博&amp;lt;/a&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    },&lt;br /&gt;...&lt;br /&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;最后来张图吧&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/8814/2011030523123612.png" /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/onlytiancai/aggbug/1971912.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/onlytiancai/archive/2011/03/05/1971912.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/onlytiancai/archive/2011/03/04/1970499.html</id><title type="text">如何高效的利用新浪微博获取信息</title><summary type="text">如果您是新浪微博用户，您是否被海量的微博信息占去了大量的时间，您是否想省时，省力，高效的获取公共信息并了解好友动态？ 在这个信息爆炸的时代，我们需要的不是大量的可有可无的信息，而是少量的对我们有用的信息。微博是一个获取信息的很好的来源，有大量有意思的有价值的信息在里面，但也有很多刷屏的，抱怨的，发广告的，发无用信息的人。再就是你关注的一个人不可能发每一条信息都是有价值的，那样的话这个人就太累了，大多数人发布微博都是很随性的，除了那些有特殊目的的官方的微博。 这样当你关注的人到200以上之后，你就对信息无所适从了，新浪微博默认是按照信息的发布时间倒序排列的，你不可能时时刻刻关注这微博，但你不时时</summary><published>2011-03-03T23:25:00Z</published><updated>2011-03-03T23:25:00Z</updated><author><name>蛙蛙王子</name><uri>http://www.cnblogs.com/onlytiancai/</uri></author><link rel="alternate" href="http://www.cnblogs.com/onlytiancai/archive/2011/03/04/1970499.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/onlytiancai/archive/2011/03/04/1970499.html"/><content type="html">如果您是&lt;a href="http://t.sina.com.cn/" target="_blank" id="url_1"&gt;新浪微博&lt;/a&gt;用户，您是否被海量的微博信息占去了大量的时间，您是否想省时，省力，高效的获取公共信息并了解好友动态？&lt;br /&gt;　　在这个信息爆炸的时代，我们需要的不是大量的可有可无的信息，而是少量的对我们有用的信息。微博是一个获取信息的很好的来源，有大量有意思的有价值的信息在里面，但也有很多刷屏的，抱怨的，发广告的，发无用信息的人。再就是你关注的一个人不可能发每一条信息都是有价值的，那样的话这个人就太累了，大多数人发布微博都是很随性的，除了那些有特殊目的的官方的微博。&lt;br /&gt;　　这样当你关注的人到200以上之后，你就对信息无所适从了，新浪微博默认是按照信息的发布时间倒序排列的，你不可能时时刻刻关注这微博，但你不时时刻刻关注微博，很有可能你看微博的时候看到的都是人家发牢骚的信息，而你正在工作的时候发了一条对你很有价值的信息。&lt;br /&gt;　　如果你是个微博新手的话，第一个先要学习的是对关注的人进行分类，否则关注的人多了，微博就没法儿用了，成了负担，而不是工具。&lt;br /&gt;　　我的方案是把亲朋好友分一组，就是你的同事，家人，闺秘，哥们都分到一个好友组，每天每条都看，如果上班时间来不及看，可以在下班回家路上用wap版看。其实这些人是你最关心的人，你更在乎他们的动态，这也是微博的SNS的功能做在。根据我的经验，和你关系比较好的朋友也就几十个人，如果没有话痨的话，每天也就更新100条左右，100条微博，在路上大约花半小时就能阅读完和回复完。通过这些交互，你能和你最好的便宜保持联系。&lt;br /&gt;　　然后把名人，网友，同行，冷笑话，新闻等根据自己的分类标准手工分类，然后每天看这个分类里转发数最多的前三十条围脖，既省时，又高效，还不会错过精彩有价值围脖。比如我就分了IT，娱乐，网友，新闻，编程，移动互联网这么几个组，每天回家路上看完好友的微博后就看这些分类的转发数最多的微博。其实说白了，对于不是自己的好友，根本就不用关注，以后新浪微博肯定会推出list的功能，就是给你把微博上的人分好类，你只要关注这个list，这个list里的所有的人发布的微博都能看到，而且我大胆预测下，新浪微博还会提供每个list一个时间段内转发数或评论数最多的top n条微博，因为现在的话题功能就有这功能了，你可以搜索一个关键字，然后可以只看原创的，或只看今天转发数最多的，甚至可以看只带图的，只带视频的，和你一个城市人发的微博，筛选条件很多很全，我再大胆预测一下，以后这些自定义的筛选条件可以收藏，以后你看完亲朋好友的微博后直接查看这个筛选条件的微博就行了，省时，省力，高效，没压力。&lt;br /&gt;　　当然，现在新浪的list功能还没有完全开放，每个list里转发最多的微博功能也没提供，只是beta api里提供了一些接口，我根据此接口开发了一个原型应用：&lt;br /&gt;1、如果你给微博分了组，&lt;a href="http://www.hello263.com/me.aspx" target="_blank" id="url_2"&gt;鼠兔网微阅读&lt;/a&gt;功能录后显示你关注的每个分组里今日发表的转发数最多的前30条微博。&lt;br /&gt;2、官方提供了两个预制的列表，一个是&lt;a href="http://www.hello263.com/p/joke.aspx" target="_blank" id="url_3"&gt;笑话专刊&lt;/a&gt;，一个是&lt;a href="http://www.hello263.com/p/it.aspx" target="_blank" id="url_4"&gt;互联网专刊&lt;/a&gt;，都把相关的内容按转发数进行排序：&lt;br /&gt;　　2.1、前者针对普通人，把&lt;a href="http://t.sina.com.cn/1644395354" target="_blank" id="url_5"&gt;冷笑话精选&lt;/a&gt;，&lt;a href="http://t.sina.com.cn/1615743184" target="_blank" id="url_6"&gt;全球奇闻趣事&lt;/a&gt;，&lt;a href="http://t.sina.com.cn/1644570320" target="_blank" id="url_7"&gt;当时我震惊了&lt;/a&gt;，&lt;a href="http://hhttp//t.sina.com.cn/1628951200" target="_blank" id="url_23"&gt;段子&lt;/a&gt;，&lt;a href="http://t.sina.com.cn/1660452532" target="_blank" id="url_8"&gt;猫扑&lt;/a&gt;等比较经典的冷笑话微博当天发布的内容进行了聚合，并按照转发数排序，你直接可以看到今天最流行的笑话是什么，放松你一天紧张工作的心情。&lt;br /&gt;　　2.2、后者互联网专刊是针对产品经理和互联网感兴趣的朋友，聚合了&lt;a href="http://t.sina.com.cn/1197161814" target="_blank" id="url_9"&gt;李开复&lt;/a&gt;，&lt;a href="http://t.sina.com.cn/1729853157" target="_blank" id="url_10"&gt;蔡文胜&lt;/a&gt;，&lt;a href="http://t.sina.com.cn/1634074550" target="_blank" id="url_11"&gt;王煜全&lt;/a&gt;,&lt;a href="http://t.sina.com.cn/1494759712" target="_blank" id="url_12"&gt;月光博客&lt;/a&gt;，&lt;a href="http://t.sina.com.cn/1627825392" target="_blank" id="url_13"&gt;互联网哪些事&lt;/a&gt;，&lt;a href="http://t.sina.com.cn/1642634100" target="_blank" id="url_14"&gt;新浪科技&lt;/a&gt;，&lt;a href="http://t.sina.com.cn/1649252577" target="_blank" id="url_15"&gt;创业邦&lt;/a&gt;,&lt;a href="http://t.sina.com.cn/techweb" target="_blank" id="url_16"&gt;techweb&lt;/a&gt;，&lt;a href="http://t.sina.com.cn/1763362173" target="_blank" id="url_17"&gt;网站分析工会&lt;/a&gt;等互联网名人的微博。&lt;br /&gt;3、&lt;a href="http://www.hello263.com/me.aspx" target="_blank" id="url_18"&gt;微阅读&lt;/a&gt;功能除了能在PC上阅读，也可以使用&lt;a href="http://www.hello263.com/reader.aspx" target="_blank" id="url_19"&gt;微阅读手机版&lt;/a&gt;在手机上阅读，只要你的手机能上网（比如大多数诺基亚手机）就可以阅读，做的比较简单是xhtml2.0的，我觉得信息阅读类的手机应用没太必要用android,iphone等原生程序来呈现，就网页程序就挺好的，挺多加一些HTML5的效果加强用户体验。&lt;br /&gt;4、如果你平时有收藏有价值信息的习惯，你还可以把你每天收藏的好微博发布成&lt;a href="http://www.hello263.com/default.aspx" target="_blank" id="url_20"&gt;微博报&lt;/a&gt;分享给大家，如果你每天分享的微博都很有价值，很给力，满足和你同样兴趣的朋友，相信你的微博报会越来越受欢迎的，这里有一些小建议提供给要制作自己的微博报的同学&lt;br /&gt;　　4.1、尽量保持你的微博报有一个明显的主题，比如娱乐，健康，笑话，旅游等，这样更容易得到同一兴趣的读者。&lt;br /&gt;　　4.2、尽量在固定的时间点发布微博报，这样读者可以固定的时间来收取报纸&lt;br /&gt;　　4.3、报纸条目尽量少而精，为用户节省阅读时间，一期报纸最好不要超过30条微博条目。&lt;br /&gt;5、默认你创办的微博报只能用PC或者比较高级的浏览器查看，但我也提供了&lt;a href="http://www.hello263.com/api/readme.aspx" target="_blank" id="url_21"&gt;相关API&lt;/a&gt;，欢迎iphone,android等手机开发者开发&lt;a href="http://www.hello263.com/default.aspx" target="_blank" id="url_22"&gt;鼠兔网微博杂志&lt;/a&gt;的手机客户端哦&lt;br /&gt;&lt;img src="http://www.cnblogs.com/onlytiancai/aggbug/1970499.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/onlytiancai/archive/2011/03/04/1970499.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
