﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-用代码编织自己的艺术人生</title><link>http://www.cnblogs.com/walkingboy/</link><description>软件开发不仅是一个技术问题，更是一个心理学的问题!</description><language>zh-cn</language><lastBuildDate>Wed, 10 Feb 2010 03:26:17 GMT</lastBuildDate><pubDate>Wed, 10 Feb 2010 03:26:17 GMT</pubDate><ttl>60</ttl><item><title>你真的懂HTML吗-从&amp;quot;最新闪存&amp;quot;说起</title><link>http://www.cnblogs.com/walkingboy/archive/2009/11/04/do-you-understand-html.html</link><dc:creator>浪子</dc:creator><author>浪子</author><pubDate>Wed, 04 Nov 2009 15:05:00 GMT</pubDate><guid>http://www.cnblogs.com/walkingboy/archive/2009/11/04/do-you-understand-html.html</guid><description><![CDATA[<p>阅读: 3671 评论: 56 作者: <a href="http://www.cnblogs.com/walkingboy/" target="_blank">浪子</a> 发表于 2009-11-04 23:05 <a href="http://www.cnblogs.com/walkingboy/archive/2009/11/04/do-you-understand-html.html" target="_blank">原文链接</a></p><h2>楔子</h2> <p>博客园最近正在整合闪存和博客.刚好我最近也在捣腾博皮,所以关注了下整合的结果.不得不说,园子最终的生成的html相当的不规范,语义性混乱,或者说很多冗余,也许就是所谓的div强迫症/class强迫症.</p> <h2>HTML的语义性</h2> <p>我不知道从什么时候开始,Table的布局开始为国人所唾弃,div+css的布局开始大受吹捧.不管引领潮流的是哪个,我们所追求的目标是一致的,"让html更简练,更可读."</p> <ul> <li>更简练,意味着去除不需要的冗余,分离内容和展现,清除纯粹用于布局的tag.  <li>更可读,意味着提高html本身的语义性,让html解释它本身所要表达的意思. </li></ul> <p>而这样子做的好处是什么呢?</p> <ul> <li>简练,让内容和展现松耦合,利于分工,最大化利用web缓存机制,减少网路流量,加快页面渲染.  <li>可读,让内容结构更清晰,利于被各种终端理解(比如盲人的屏幕阅读器,搜索引擎的爬虫). </li></ul> <h2>Block-level Elements(块级元素) VS Inline Elements(内联元素)</h2> <p>在Html的规范中,这么说到(摘自<a href="http://www.cnblogs.com/ruxpinsp1/" target="_blank">棕熊</a>童鞋的<a href="http://www.cnblogs.com/ruxpinsp1/archive/2008/07/03/quicky-block-vs-inline.html" target="_blank">[Quicky] block 和 inline 的区别是？</a>)</p> <blockquote> <p>所有允许被 BODY 元素包含的元素，要么是块级的；要么是内联的；要么既可以算作块级的，也可以算作内联的。但是绝对不存在一个能被BODY包含，但即非块级，又非内联的元素。 <br>常见的块级元素有 DIV, FORM, TABLE, P, PRE, H1~H6, DL, OL, UL 等等。 <br>常见的内联元素有 SPAN, A, STRONG, EM, LABEL, INPUT, SELECT, TEXTAREA, IMG, BR 等等。 <br>另外，SCRIPT, OBJECT, MAP, BUTTON, DEL, INS 这些元素，既可以作为块级元素，也可以作为内联元素。</p></blockquote> <p>&nbsp;</p> <p>那么块级元素和内联元素具体有什么区别呢？具体表现在以下几个方面：&nbsp; </p> <p>一般来说块级元素可以包含块级元素和内联元素；但内联元素只能包含内联元素。 要注意的是，每个特定的元素，能包含的元素也是特定的，所以具体到个别元素上，这条规律是不适用的。 </p> <p>比如 P 元素，只能包含内联元素，而不能包含块级元素。 </p><pre class="code"><h4>code</h4><span style="color: #008000">&lt;!-- 这是不符合规范的 --&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">div</span><span style="color: #0000ff">&gt;</span>balalbalabala<span style="color: #0000ff">&lt;/</span><span style="color: #800000">div</span><span style="color: #0000ff">&gt;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;</span>
<span style="color: #008000">&lt;!-- 这是规范允许的--&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">span</span><span style="color: #0000ff">&gt;</span>balalbalabala<span style="color: #0000ff">&lt;/</span><span style="color: #800000">span</span><span style="color: #0000ff">&gt;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;</span></pre>
<p>&nbsp;</p>
<p>具体关于这方面的知识,大家可以阅读<a href="http://www.cnblogs.com/ruxpinsp1/" target="_blank">棕熊</a>童鞋的<a href="http://www.cnblogs.com/ruxpinsp1/archive/2008/07/03/quicky-block-vs-inline.html" target="_blank">[Quicky] block 和 inline 的区别是？</a></p>
<h2>为什么是div+css的布局</h2>
<p>把追求语义性定义为"div+css布局",其实是狭隘的.我觉得它的完整说法应该是"无语义性tag+css做布局,语义性tag组织内容".我们知道 html的tag大部分本身都有自身的语义性的.比如p,是段落,br是换行,你不能用p来做换行,用br来做段落,这样就会导致html本身的语义产生混乱.而div和span刚好是html中两个本身不具备语义性的tag. 但是span是inline element,所以不适合做容器,div是块级元素,所以毫无疑问它成为我们做布局的最好选择,也才有了"div+css布局"一说.</p>
<h2>div强迫症/class强迫症</h2>
<p>在第一版本的整合中,最新闪存的html结构大致如下</p><pre class="code"><h4>code</h4><span style="color: #0000ff">&lt;</span><span style="color: #800000">div</span> <span style="color: #ff0000">class</span>=<span style="color: #0000ff">"day"</span><span style="color: #0000ff">&gt;</span>
  <span style="color: #0000ff">&lt;</span><span style="color: #800000">div</span> <span style="color: #ff0000">class</span>=<span style="color: #0000ff">"dayTitle"</span><span style="color: #0000ff">&gt;</span>
  <span style="color: #0000ff">&lt;/</span><span style="color: #800000">div</span><span style="color: #0000ff">&gt;</span>
  <span style="color: #0000ff">&lt;</span><span style="color: #800000">div</span> <span style="color: #ff0000">class</span>=<span style="color: #0000ff">"my_ing"</span><span style="color: #0000ff">&gt;</span>
      一个良好的讨论氛围,是一家好公司的最基本条件.<span style="color: #0000ff">&lt;</span><span style="color: #800000">a</span> <span style="color: #ff0000">class</span>=<span style="color: #0000ff">"ing_lnk"</span> <span style="color: #ff0000">href</span>=<span style="color: #0000ff">"http://home.cnblogs.com/ing/58955/"</span><span style="color: #0000ff">&gt;</span>10-30 14:44<span style="color: #0000ff">&lt;/</span><span style="color: #800000">a</span><span style="color: #0000ff">&gt;</span>
      <span style="color: #0000ff">&lt;</span><span style="color: #800000">br</span><span style="color: #0000ff">&gt;</span>     <br>      经济危机,重新开垦一亩三分地......<span style="color: #0000ff">&lt;</span><span style="color: #800000">a</span> <span style="color: #ff0000">class</span>=<span style="color: #0000ff">"ing_lnk"</span> <span style="color: #ff0000">href</span>=<span style="color: #0000ff">"http://home.cnblogs.com/ing/58457/"</span><span style="color: #0000ff">&gt;</span>10-28 13:45<span style="color: #0000ff">&lt;/</span><span style="color: #800000">a</span><span style="color: #0000ff">&gt;</span>
      <span style="color: #0000ff">&lt;</span><span style="color: #800000">br</span><span style="color: #0000ff">&gt;</span>
      学习是个轮回,重新上路ing...<span style="color: #0000ff">&lt;</span><span style="color: #800000">a</span> <span style="color: #ff0000">class</span>=<span style="color: #0000ff">"ing_lnk"</span> <span style="color: #ff0000">href</span>=<span style="color: #0000ff">"http://home.cnblogs.com/ing/32400/"</span><span style="color: #0000ff">&gt;</span>06-01 21:06<span style="color: #0000ff">&lt;/</span><span style="color: #800000">a</span><span style="color: #0000ff">&gt;</span>
      <span style="color: #0000ff">&lt;</span><span style="color: #800000">br</span><span style="color: #0000ff">&gt;</span>
      <span style="color: #0000ff">&lt;</span><span style="color: #800000">a</span> <span style="color: #ff0000">class</span>=<span style="color: #0000ff">"ing_lnk"</span> <span style="color: #ff0000">href</span>=<span style="color: #0000ff">"http://home.cnblogs.com/walkingboy/ing/&lt;/span&gt;"</span><span style="color: #0000ff">&gt;</span>更多闪存...<span style="color: #0000ff">&lt;/</span><span style="color: #800000">a</span><span style="color: #0000ff">&gt;</span>
  <span style="color: #0000ff">&lt;/</span><span style="color: #800000">div</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;/</span><span style="color: #800000">div</span><span style="color: #0000ff">&gt;</span></pre>
<ul>
<li>首先,最新闪存被放在post的列表容器内,而且使用一样的容器class标识,这就导致做css的时候很难定位它. 
<li>其次br被用来做列表, 
<li>再次more link和list item又进行混淆. </li></ul>
<p>我本来想为自己的博皮调调css,结果发现这个结构真是很晕,然后发了条建议<a href="http://space.cnblogs.com/forum/topic/33836/" target="_blank">闪存的html位置和结构竟然和Post一样,很难修改皮肤啊.</a> </p>
<p>不得不说,园子团队的反应速度还是可以的,昨天晚上又进行了更新,我们看下第二版本的html结构.</p><pre class="code"><h4>code</h4><span style="color: #0000ff">&lt;</span><span style="color: #800000">div</span> <span style="color: #ff0000">id</span>=<span style="color: #0000ff">"side_ing_block"</span><span style="color: #0000ff">&gt;</span>
   <span style="color: #0000ff">&lt;</span><span style="color: #800000">h3</span> <span style="color: #ff0000">class</span>=<span style="color: #0000ff">"catListTitle"</span><span style="color: #0000ff">&gt;</span>最新闪存<span style="color: #0000ff">&lt;/</span><span style="color: #800000">h3</span><span style="color: #0000ff">&gt;</span>
   <span style="color: #0000ff">&lt;</span><span style="color: #800000">div</span> <span style="color: #ff0000">class</span>=<span style="color: #0000ff">"side_ing_list"</span><span style="color: #0000ff">&gt;</span>
     <span style="color: #0000ff">&lt;</span><span style="color: #800000">ul</span><span style="color: #0000ff">&gt;</span>
       <span style="color: #0000ff">&lt;</span><span style="color: #800000">li</span><span style="color: #0000ff">&gt;</span>一个良好的讨论氛围,是一家好公司的最基本条件. <span style="color: #0000ff">&lt;</span><span style="color: #800000">a</span> <span style="color: #ff0000">class</span>=<span style="color: #0000ff">"ing_lnk"</span> <span style="color: #ff0000">href</span>=<span style="color: #0000ff">"http://home.cnblogs.com/ing/58955/"</span><span style="color: #0000ff">&gt;</span>10-3014:44<span style="color: #0000ff">&lt;/</span><span style="color: #800000">a</span><span style="color: #0000ff">&gt;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">li</span><span style="color: #0000ff">&gt;</span> <br>       <span style="color: #0000ff">&lt;</span><span style="color: #800000">li</span><span style="color: #0000ff">&gt;</span>经济危机,重新开垦一亩三分地......<span style="color: #0000ff">&lt;</span><span style="color: #800000">a</span> <span style="color: #ff0000">class</span>=<span style="color: #0000ff">"ing_lnk"</span> <span style="color: #ff0000">href</span>=<span style="color: #0000ff">"http://home.cnblogs.com/ing/58457/"</span><span style="color: #0000ff">&gt;</span>10-2813:45<span style="color: #0000ff">&lt;/</span><span style="color: #800000">a</span><span style="color: #0000ff">&gt;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">li</span><span style="color: #0000ff">&gt;</span>
       <span style="color: #0000ff">&lt;</span><span style="color: #800000">li</span><span style="color: #0000ff">&gt;</span>学习是个轮回,重新上路ing...  <span style="color: #0000ff">&lt;</span><span style="color: #800000">a</span> <span style="color: #ff0000">class</span>=<span style="color: #0000ff">"ing_lnk"</span> <span style="color: #ff0000">href</span>=<span style="color: #0000ff">"http://home.cnblogs.com/ing/32400/"</span><span style="color: #0000ff">&gt;</span>06-0121:06<span style="color: #0000ff">&lt;/</span><span style="color: #800000">a</span><span style="color: #0000ff">&gt;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">li</span><span style="color: #0000ff">&gt;</span> <br>       <span style="color: #0000ff">&lt;</span><span style="color: #800000">li</span><span style="color: #0000ff">&gt;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">a</span> <span style="color: #ff0000">class</span>=<span style="color: #0000ff">"ing_lnk"</span> <span style="color: #ff0000">href</span>=<span style="color: #0000ff">"http://home.cnblogs.com/walkingboy/ing/&lt;/span&gt;"</span><span style="color: #0000ff">&gt;</span>更多闪存...<span style="color: #0000ff">&lt;/</span><span style="color: #800000">a</span><span style="color: #0000ff">&gt;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">li</span><span style="color: #0000ff">&gt;</span>
     <span style="color: #0000ff">&lt;/</span><span style="color: #800000">ul</span><span style="color: #0000ff">&gt;</span>
  <span style="color: #0000ff">&lt;/</span><span style="color: #800000">div</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;/</span><span style="color: #800000">div</span><span style="color: #0000ff">&gt;</span></pre>
<p>不错,语义性已经有一定的修改了,但是还是有太多的冗余tag.</p>
<p>原来<a href="http://www.cnblogs.com/cathsfz/" target="_blank">Cat Chen</a>有篇文章叫<a href="http://www.cnblogs.com/cathsfz/archive/2007/03/19/679276.html" target="_blank">你有 &lt;table /&gt; 强迫症吗？</a>.</p>
<p>我想我们可以说上面的html是有强烈的&lt;div/&gt;强迫症+class强迫症. 为什么这么说呢. </p><pre class="code"><h4>&lt;div/&gt;强迫症+class强迫症</h4><span style="color: #0000ff">&lt;</span><span style="color: #800000">div</span> <span style="color: #ff0000">id</span>=<span style="color: #0000ff">"side_ing_block"</span><span style="color: #0000ff">&gt;</span>
   <span style="color: #0000ff">&lt;</span><span style="color: #800000">h3</span> <span style="color: #ff0000">class</span>=<span style="color: #0000ff">"catListTitle"</span><span style="color: #0000ff">&gt;</span>最新闪存<span style="color: #0000ff">&lt;/</span><span style="color: #800000">h3</span><span style="color: #0000ff">&gt;</span><span style="color: #008000">&lt;!--这个class是完全多余的,h3已经很好的显示了它的语义,css定位也是明确的#side_ing_block h3 ,找不到它留下来的理由  --&gt;</span> <br>   <span style="color: #0000ff">&lt;</span><span style="color: #800000">div</span> <span style="color: #ff0000">class</span>=<span style="color: #0000ff">"side_ing_list"</span><span style="color: #0000ff">&gt;</span><span style="color: #008000">&lt;!--ul已经表示了是个list,何必再一个div+class来标识呢?css的定位也是明确的#side_ing_block ul--&gt;</span>
      <span style="color: #0000ff">&lt;</span><span style="color: #800000">ul</span><span style="color: #0000ff">&gt;</span>
        <span style="color: #0000ff">&lt;</span><span style="color: #800000">li</span><span style="color: #0000ff">&gt;</span>一个良好的讨论氛围,是一家好公司的最基本条件.<span style="color: #0000ff">&lt;</span><span style="color: #800000">a</span> <span style="color: #ff0000">class</span>=<span style="color: #0000ff">"ing_lnk"</span> <span style="color: #ff0000">href</span>=<span style="color: #0000ff">"http://home.cnblogs.com/ing/58955/"</span><span style="color: #0000ff">&gt;</span>10-3014:44<span style="color: #0000ff">&lt;/</span><span style="color: #800000">a</span><span style="color: #0000ff">&gt;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">li</span><span style="color: #0000ff">&gt;</span> <br>        <span style="color: #0000ff">&lt;</span><span style="color: #800000">li</span><span style="color: #0000ff">&gt;</span>经济危机,重新开垦一亩三分地......<span style="color: #0000ff">&lt;</span><span style="color: #800000">a</span> <span style="color: #ff0000">class</span>=<span style="color: #0000ff">"ing_lnk"</span> <span style="color: #ff0000">href</span>=<span style="color: #0000ff">"http://home.cnblogs.com/ing/58457/"</span><span style="color: #0000ff">&gt;</span>10-2813:45<span style="color: #0000ff">&lt;/</span><span style="color: #800000">a</span><span style="color: #0000ff">&gt;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">li</span><span style="color: #0000ff">&gt;</span>
        <span style="color: #0000ff">&lt;</span><span style="color: #800000">li</span><span style="color: #0000ff">&gt;</span>学习是个轮回,重新上路ing... <span style="color: #0000ff">&lt;</span><span style="color: #800000">a</span> <span style="color: #ff0000">class</span>=<span style="color: #0000ff">"ing_lnk"</span> <span style="color: #ff0000">href</span>=<span style="color: #0000ff">"http://home.cnblogs.com/ing/32400/"</span><span style="color: #0000ff">&gt;</span>06-0121:06<span style="color: #0000ff">&lt;/</span><span style="color: #800000">a</span><span style="color: #0000ff">&gt;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">li</span><span style="color: #0000ff">&gt;</span> <br>        <span style="color: #0000ff">&lt;</span><span style="color: #800000">li</span><span style="color: #0000ff">&gt;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">a</span> <span style="color: #ff0000">class</span>=<span style="color: #0000ff">"ing_lnk"</span> <span style="color: #ff0000">href</span>=<span style="color: #0000ff">http:</span>//<span style="color: #ff0000">home</span>.<span style="color: #ff0000">cnblogs</span>.<span style="color: #ff0000">com</span>/<span style="color: #ff0000">walkingboy</span>/<span style="color: #ff0000">ing</span>/&gt;更多闪存...<span style="color: #0000ff">&lt;/</span><span style="color: #800000">a</span><span style="color: #0000ff">&gt;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">li</span><span style="color: #0000ff">&gt;</span><span style="color: #008000">&lt;!--不是相同项,怎么能并入相同的列表呢?即使不管语义性,这样子的定义,css也不好定位啊--&gt;</span>
      <span style="color: #0000ff">&lt;/</span><span style="color: #800000">ul</span><span style="color: #0000ff">&gt;</span>
   <span style="color: #0000ff">&lt;/</span><span style="color: #800000">div</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;/</span><span style="color: #800000">div</span><span style="color: #0000ff">&gt;</span></pre>
<p>我个人认为就"最新闪存"这部分的html,更好的结构应该是</p><pre class="code"><h4>code</h4><span style="color: #0000ff">&lt;</span><span style="color: #800000">div</span> <span style="color: #ff0000">id</span>=<span style="color: #0000ff">"side_ing_block"</span><span style="color: #0000ff">&gt;</span>
   <span style="color: #0000ff">&lt;</span><span style="color: #800000">h3</span><span style="color: #0000ff">&gt;</span>最新闪存<span style="color: #0000ff">&lt;/</span><span style="color: #800000">h3</span><span style="color: #0000ff">&gt;</span>
   <span style="color: #0000ff">&lt;</span><span style="color: #800000">ul</span><span style="color: #0000ff">&gt;</span>
     <span style="color: #0000ff">&lt;</span><span style="color: #800000">li</span><span style="color: #0000ff">&gt;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">a</span> <span style="color: #ff0000">href</span>=<span style="color: #0000ff">"http://home.cnblogs.com/ing/58955/"</span><span style="color: #0000ff">&gt;</span>一个良好的讨论氛围,是一家好公司的最基本条件.  10-30 14:44<span style="color: #0000ff">&lt;/</span><span style="color: #800000">a</span><span style="color: #0000ff">&gt;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">li</span><span style="color: #0000ff">&gt;</span>
     <span style="color: #0000ff">&lt;</span><span style="color: #800000">li</span><span style="color: #0000ff">&gt;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">a</span> <span style="color: #ff0000">href</span>=<span style="color: #0000ff">"http://home.cnblogs.com/ing/58457/"</span><span style="color: #0000ff">&gt;</span>经济危机,重新开垦一亩三分地......10-28 13:45<span style="color: #0000ff">&lt;/</span><span style="color: #800000">a</span><span style="color: #0000ff">&gt;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">li</span><span style="color: #0000ff">&gt;</span>
     <span style="color: #0000ff">&lt;</span><span style="color: #800000">li</span><span style="color: #0000ff">&gt;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">a</span> <span style="color: #ff0000">href</span>=<span style="color: #0000ff">"http://home.cnblogs.com/ing/32400/"</span><span style="color: #0000ff">&gt;</span>学习是个轮回,重新上路ing...06-01 21:06<span style="color: #0000ff">&lt;/</span><span style="color: #800000">a</span><span style="color: #0000ff">&gt;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">li</span><span style="color: #0000ff">&gt;</span> <br>   <span style="color: #0000ff">&lt;/</span><span style="color: #800000">ul</span><span style="color: #0000ff">&gt;</span>
   <span style="color: #0000ff">&lt;</span><span style="color: #800000">span</span><span style="color: #0000ff">&gt;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">a</span> <span style="color: #ff0000">href</span>=<span style="color: #0000ff">http:</span>//<span style="color: #ff0000">home</span>.<span style="color: #ff0000">cnblogs</span>.<span style="color: #ff0000">com</span>/<span style="color: #ff0000">walkingboy</span>/<span style="color: #ff0000">ing</span><span style="color: #0000ff">/&gt;</span>更多闪存...<span style="color: #0000ff">&lt;/</span><span style="color: #800000">a</span><span style="color: #0000ff">&gt;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">span</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;/</span><span style="color: #800000">div</span><span style="color: #0000ff">&gt;</span></pre>
<p>&nbsp;</p>
<p>当然我们当前是孤立的看待这段html，如果我们把它放入整个页面的结构中，还是需要适当的修改的。比如&lt;div id="<span style="color: #8b0000">side_ing_block</span>"&gt;应该修改为 &lt;div id="<span style="color: #8b0000">side_ing_block</span>" class="block"&gt;，block是页面块状结构的一个基础样式，不过园子的left menu里面的div都是独立的，没有抽象出一个基础样式class，所以每次新加入一个模块，所有的博皮都得修改。而span也应该多加一个 class="more".这些已经不是html语义化的范畴，而是css复用的设计问题了，不在这篇文章的谈论之内。</p>
<p>随着&lt;table/&gt;强迫症的逐渐消失,我们应该警惕&lt;div/&gt;强迫症,class强迫症的不断抬头,追求标准我们永不止步,但是也不能迷失自我.</p>
<div class="copyright">
<p>本文基于<a href="http://creativecommons.org/licenses/by/2.5/cn/" target="_blank">署名 2.5 中国大陆</a>许可协议发布，正品行货，如有雷同，皆为山寨，作者保留追究权利，在保留本文的署名<a href="http://www.cnblogs.com/walkingboy/" target="_blank">陈达艺</a>（包含链接）的情况下,允许进行转载，演绎或用于商业目的。如您有任何疑问或者授权方面的协商，请用<a href="mailto:langzi.tech@gmail.com" target="_blank">E-Mail</a>/<a href="msnim:chat?contact=cnlangzi@live.com" target="_blank">MSN</a>联系我。</p></div><img src="http://www.cnblogs.com/walkingboy/aggbug/1596272.html?type=1" width="1" height="1" alt=""/><p>评论: 56　<a href="http://www.cnblogs.com/walkingboy/archive/2009/11/04/do-you-understand-html.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/walkingboy/archive/2009/11/04/do-you-understand-html.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56814/" target="_blank">Sun前CEO欲写自传 称经济危机是Sun被购主因</a><span style="color:gray">(2010-02-10 11:25)</span><br/>· <a href="http://news.cnblogs.com/n/56812/" target="_blank">Google社会化产品Buzz发布会实录</a><span style="color:gray">(2010-02-10 11:15)</span><br/>· <a href="http://news.cnblogs.com/n/56813/" target="_blank">福布斯：苹果生态产业链上的十大企业</a><span style="color:gray">(2010-02-10 11:14)</span><br/>· <a href="http://news.cnblogs.com/n/56811/" target="_blank">纽约时报：Google凭借Buzz进军社交网络</a><span style="color:gray">(2010-02-10 10:59)</span><br/>· <a href="http://news.cnblogs.com/n/56810/" target="_blank">百度视频公司龚宇：图文时代互联网竞争已定</a><span style="color:gray">(2010-02-10 10:56)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56812/" target="_blank">Google社会化产品Buzz发布会实录</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>LINQ TO SQLite实践指南</title><link>http://www.cnblogs.com/walkingboy/archive/2009/10/27/linqtosqlite.html</link><dc:creator>浪子</dc:creator><author>浪子</author><pubDate>Tue, 27 Oct 2009 14:50:00 GMT</pubDate><guid>http://www.cnblogs.com/walkingboy/archive/2009/10/27/linqtosqlite.html</guid><description><![CDATA[<p>阅读: 2166 评论: 14 作者: <a href="http://www.cnblogs.com/walkingboy/" target="_blank">浪子</a> 发表于 2009-10-27 22:50 <a href="http://www.cnblogs.com/walkingboy/archive/2009/10/27/linqtosqlite.html" target="_blank">原文链接</a></p><h2>前言<br />
</h2>
<p>当前,软件应用程序中,数据库已经成为不可缺少的重要组成部分.然而传统数据库正趋向巨无霸化,对系统的要求一步步提高,管理成本也越来越大,对于中小型项目的应用,它的很多功能变得越来越多余,但是我却不得不为这些不需要的功能付出更多的资金和人力成本. 在这些场景,嵌入式数据库的轻量,零部署,跨平台,义移植,无疑有着传统数据库无可比拟的优点,当然为此我们必须放弃高容量,高性能,高并发,不过谁在乎这些呢?我们只是中小型应用而已,大小不上百万,并发不超万^_^.</p>
<p>在.Net中,我们可以选择的嵌入式数据库还是挺多的,<a href="http://www.db4o.com/" target="_blank">db4o</a>,<a href="http://www.sqlite.org/" target="_blank">sqlite</a>,各种xml db. 我之前更倾向于使用db4o,db4o对于用传统ADO.Net驱动的开发有更多的优势,无需手动Mapping,零SQL.不过整因为db4o做了很多处理,所以在数据持久化的过程中,我们能干预的也很少,而db4o在复合属性,级联属性,特别当整个系统使用富领域模型设计的时候,保存数据的时候往往会出错.为此我们不得不自己手工持久化复合对象中的各个对象,增加关联字段进行关联,这样一来就越加靠近SQL Server之类的传统数据库的时候,显得名不符实.而在web应用中,为了提供并发的能力,还必须使用server/client的模式进行数据传输.总让我感觉有那么点点别扭.</p>
<p>自从DLINQ出来之后,我的项目越来越依赖于它,它让我们的程序更加优雅清晰,再也不用无聊的拼凑一段又一段的sql,编写一遍又遍的配置.可惜的是MS只提供LINQ TO SQL(MS SQL SERVER)的实现. 还好LINQ思想出现之后,社区里涌现了各种各样的LINQ Provider程序,大有一切皆LINQ的架势(LINQ TO Everything),SQLite自然不例外.今天我们进来唠唠如何将SQLite引入我们的开发.</p>
<h2>ADO.Net Provider&amp;LINQ Provider</h2>
<p>首先,下载SQLite的LINQ Provider,在网上我们可以找到两个LINQ Provider For SQLite. 一个是<a href="http://www.sqlite.org/" target="_blank">phxsoftware</a>的<a href="http://www.sqlite.org/download.html" target="_blank">System.Data.SQLite</a>,另一个是<a href="http://www.devart.com/" target="_blank">devart</a>的<a href="http://www.devart.com/dotconnect/sqlite/download.html" target="_blank">dotConnect for SQLite</a>. System.Data.SQLite是开源产品,而dotConnect For SQLite是商业产品(有个一个免费普通版本).我们这里选择System.Data.SQLite作为我们的LINQ Provider.</p>
<p>从Sourceforge下载<a title="http://sourceforge.net/projects/sqlite-dotnet2/files/SQLite%20for%20ADO.NET%202.0/1.0.60.0/SQLite-1.0.60.0-setup.exe/download" href="http://sourceforge.net/projects/sqlite-dotnet2/files/SQLite%20for%20ADO.NET%202.0/1.0.60.0/SQLite-1.0.60.0-setup.exe/download" target="_blank">SQLite-1.0.60.0-setup.exe</a>,然后安装.结束的时候,会让你Install SQLite Design-Time Support,把里面的VS2005/VS2008 都打上勾</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/walkingboy/WindowsLiveWriter/LINQToSQLite_CF8A/image_2.png" target="_blank"><img title="image" style="border-width: 0px; display: inline;" alt="image" src="http://images.cnblogs.com/cnblogs_com/walkingboy/WindowsLiveWriter/LINQToSQLite_CF8A/image_thumb.png" width="504" border="0" height="417" /></a> </p>
<p>这样子你就可以在VS的Server Explorer里面像管理SQL Server的数据库一样管理你的SQLite数据库文件.安装完之后,我们得到以下文件</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/walkingboy/WindowsLiveWriter/LINQToSQLite_CF8A/image_4.png" target="_blank"><img title="image" style="border-width: 0px; display: inline;" alt="image" src="http://images.cnblogs.com/cnblogs_com/walkingboy/WindowsLiveWriter/LINQToSQLite_CF8A/image_thumb_1.png" width="504" border="0" height="378" /></a> </p>
<h2>创建数据库</h2>
<p>要创建一个空的SQLite数据库,可以选择两种方式.</p>
<p>1. 从<a title="http://www.sqlite.org/download.html" href="http://www.sqlite.org/download.html" target="_blank">http://www.sqlite.org/download.html</a>下载Window下的程序(<a title="http://www.sqlite.org/sqlite-3_6_19.zip" href="http://www.sqlite.org/sqlite-3_6_19.zip" target="_blank">http://www.sqlite.org/sqlite-3_6_19.zip</a>),然后通过命令行创建.</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/walkingboy/WindowsLiveWriter/LINQToSQLite_CF8A/image_6.png" target="_blank"><img title="image" style="border-width: 0px; display: inline;" alt="image" src="http://images.cnblogs.com/cnblogs_com/walkingboy/WindowsLiveWriter/LINQToSQLite_CF8A/image_thumb_2.png" width="504" border="0" height="317" /></a> </p>
<ul>
     <li>.db3后缀名可以任意,你也可以使用其他的任意后缀名. </li>
     <li><font color="#ff0000">在sqlite&gt;的shell下,必须输入什么,如果直接.exit退出的话,数据库文件将不会被创建</font> </li>
</ul>
<p>2.从<a title="http://www.sqlite.org/cvstrac/wiki?p=ManagementTools" href="http://www.sqlite.org/cvstrac/wiki?p=ManagementTools" target="_blank">http://www.sqlite.org/cvstrac/wiki?p=ManagementTools</a>下载各种GUI程序.</p>
<p>数据库文件创建好了之后,拷贝到你想要的位置,然后打开VS的Server Explorer(当然如果你使用GUI程序,你就不需要VS的这个功能了),我们可以在里面维护表信息</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/walkingboy/WindowsLiveWriter/LINQToSQLite_CF8A/image_12.png" target="_blank"><img title="image" style="border-width: 0px; display: inline;" alt="image" src="http://images.cnblogs.com/cnblogs_com/walkingboy/WindowsLiveWriter/LINQToSQLite_CF8A/image_thumb_5.png" width="504" border="0" height="259" /></a> </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>我们先设计两个表,以便继续下面的步骤.</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/walkingboy/WindowsLiveWriter/LINQToSQLite_CF8A/image26.png" target="_blank"><img title="image" style="border-width: 0px; display: inline;" alt="image" src="http://images.cnblogs.com/cnblogs_com/walkingboy/WindowsLiveWriter/LINQToSQLite_CF8A/image26_thumb.png" width="171" border="0" height="244" /></a> </p>
<h2>创建项目</h2>
<p><a href="http://images.cnblogs.com/cnblogs_com/walkingboy/WindowsLiveWriter/LINQToSQLite_CF8A/image30.png" target="_blank"><img title="image" style="border-width: 0px; display: inline;" alt="image" src="http://images.cnblogs.com/cnblogs_com/walkingboy/WindowsLiveWriter/LINQToSQLite_CF8A/image30_thumb.png" width="244" border="0" height="239" /></a> </p>
<h2>创建DataContext</h2>
<p>当你将表拉入dbml的时候,会得到如下错误"The selected object(s) use an unsupported data provider."</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/walkingboy/WindowsLiveWriter/LINQToSQLite_CF8A/image_18.png" target="_blank"><img title="image" style="border-width: 0px; display: inline;" alt="image" src="http://images.cnblogs.com/cnblogs_com/walkingboy/WindowsLiveWriter/LINQToSQLite_CF8A/image_thumb_8.png" width="504" border="0" height="325" /></a> </p>
<p>dbml designer和DLINQ一样,微软只实现了For SQL SERVER的功能,其他数据库都没实现.既然不能生成dmbl,那我们生成code就好了,反正这个layout我们一般也没什么用.找到从windows sdk目录下找到<a href="http://msdn.microsoft.com/en-us/library/bb386987.aspx" target="_blank">Code Generation Tool (<em>SqlMetal</em>.exe)</a>. 不幸的是,这个东东也只支持MS本家的东西,而且不支持Generator扩展-_-!!!.</p>
<p>既然<a href="http://www.sqlite.org/" target="_blank">phxsoftware</a>提供的LINQ Porivder,说不定有提供自定义的代码生成工具.不过看来看去,发现只支持Entity Frameworkd Entity Model的生成,但是没有LINQ TO SQLite的支持(<a href="http://www.devart.com/dotconnect/sqlite/download.html" target="_blank">dotConnect for SQLite</a> 倒是对二者都支持).</p>
<p>难道我们要手动编写DataContext?怎么可能,肯定有人实现了,google下,找到了一个<a href="http://code.google.com/p/dblinq2007/" target="_blank">DLINQ2007</a>的项目,提供好多LINQ Provider的实现(包括SQLite).发现里面有个DbMetal.exe,支持从SQLite生成DataContext类.虽然不如MS的的完美,不过能自动生成基本的DataContext,这就是最大的收获,不然像我这么依赖LINQ的人只好放弃SQLite了^_^.DbMetal.exe生成DataContext的命令行,类似SqlMetal.exe.</p>
<pre class="code"><p>DbMetal.exe /database:TestDataContext&nbsp; /schema /namespace=LinqToSQLite /sprocs /entityInterfaces= /culture="en"&nbsp; /code=Test.cs /provider=Sqlite&nbsp; /conn="data source=D:\doc\my\data\code\LinqToSQLite\dlls\Test.db3"</p>
</pre>
<p>/database指定类名, /namespace=LinqToSQLite指定命名空间...,具体的参数可以在命令行下获取到(dbmetal.exe /?).</p>
<p>不过这个DbMetal.exe一样不完善,不是什么结构都可以生成,比如数据库带有外键的话,生成就会出错.</p>
<p>&nbsp;</p>
<pre class="code"><h4>生成后的代码大概如下(可能需要手工清理下SystemTable的对应的class):</h4>
<span style="color: #0000ff;">public</span> partial <span style="color: #0000ff;">class</span> TestDataContext : DbLinq.Data.Linq.DataContext<br />
{<br />
<span style="color: #0000ff;">public</span> TestDataContext(System.Data.IDbConnection connection): <span style="color: #0000ff;">base</span>(connection, <span style="color: #0000ff;">new</span> DbLinq.Sqlite.SqliteVendor())<br />
{<br />
}<br />
<span style="color: #0000ff;">public</span> TestDataContext(System.Data.IDbConnection connection, DbLinq.Vendor.IVendor vendor): <span style="color: #0000ff;">base</span>(connection, vendor)<br />
{<br />
}<br />
<span style="color: #0000ff;">public</span> Table Order { <span style="color: #0000ff;">get</span> { <span style="color: #0000ff;">return</span> GetTable(); } }<br />
<span style="color: #0000ff;">public</span> Table OrderItem { <span style="color: #0000ff;">get</span> { <span style="color: #0000ff;">return</span> GetTable(); } } <br />
} <br />
</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>演示代码和相关的dlls下载:http://cid-af3411fff50fdeaa.skydrive.live.com/self.aspx/Public/Demo/LinqToSQLite.rar</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<br />
<div class="copyright">
<p>本文基于<a href="http://creativecommons.org/licenses/by/3.0/deed.zh" target="_blank">署名 3.0 中国大陆</a>许可协议发布，原创正品，如有雷同，皆为山寨，作者保留追究权利。在保留本文的署名<a href="http://www.cnblogs.com/walkingboy/" target="_blank">陈达艺</a>（包含链接）的情况下,允许进行转载,演绎或用于商业目的。如您有任何疑问或者授权方面的协商，请用<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#108;&#97;&#110;&#103;&#122;&#105;&#46;&#116;&#101;&#99;&#104;&#64;&#103;&#109;&#97;&#105;&#108;&#46;&#99;&#111;&#109;" target="_blank">E-Mail</a>/<a href="msnim:chat?contact=cnlangzi@live.com" target="_blank">MSN</a>联系我。</p>
</div><img src="http://www.cnblogs.com/walkingboy/aggbug/1590988.html?type=1" width="1" height="1" alt=""/><p>评论: 14　<a href="http://www.cnblogs.com/walkingboy/archive/2009/10/27/linqtosqlite.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/walkingboy/archive/2009/10/27/linqtosqlite.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56814/" target="_blank">Sun前CEO欲写自传 称经济危机是Sun被购主因</a><span style="color:gray">(2010-02-10 11:25)</span><br/>· <a href="http://news.cnblogs.com/n/56812/" target="_blank">Google社会化产品Buzz发布会实录</a><span style="color:gray">(2010-02-10 11:15)</span><br/>· <a href="http://news.cnblogs.com/n/56813/" target="_blank">福布斯：苹果生态产业链上的十大企业</a><span style="color:gray">(2010-02-10 11:14)</span><br/>· <a href="http://news.cnblogs.com/n/56811/" target="_blank">纽约时报：Google凭借Buzz进军社交网络</a><span style="color:gray">(2010-02-10 10:59)</span><br/>· <a href="http://news.cnblogs.com/n/56810/" target="_blank">百度视频公司龚宇：图文时代互联网竞争已定</a><span style="color:gray">(2010-02-10 10:56)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56812/" target="_blank">Google社会化产品Buzz发布会实录</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>[TDD]由SearchCriteriaBinder看Test Driven与Test First</title><link>http://www.cnblogs.com/walkingboy/archive/2009/10/20/test_driven_or_test_first.html</link><dc:creator>浪子</dc:creator><author>浪子</author><pubDate>Tue, 20 Oct 2009 14:43:00 GMT</pubDate><guid>http://www.cnblogs.com/walkingboy/archive/2009/10/20/test_driven_or_test_first.html</guid><description><![CDATA[<p>阅读: 1483 评论: 18 作者: <a href="http://www.cnblogs.com/walkingboy/" target="_blank">浪子</a> 发表于 2009-10-20 22:43 <a href="http://www.cnblogs.com/walkingboy/archive/2009/10/20/test_driven_or_test_first.html" target="_blank">原文链接</a></p><p>很久没有维护blog,近两年新工作平平淡淡,生活迷迷糊糊,自己都不知道自己在做什么了,最近看了<a href="http://www.cnblogs.com/JeffreyZhao/" target="_blank">老赵 </a>的<a id="ctl06_lnkTitle" href="http://www.cnblogs.com/JeffreyZhao/archive/2009/10/19/testability-driven-development-2.html" target="_blank">我的TDD实践：可测试性驱动开发（下）</a>和<a id="Header1_HeaderTitle" href="http://www.cnblogs.com/shuhari/" target="_blank">Shuhari</a>的<a id="ctl04_TitleUrl" href="http://www.cnblogs.com/shuhari/archive/2009/10/19/tdd_modelbinder.html" target="_blank">用TDD方式实现老赵的SearchCriteriaBinder</a>,一时手痒,也来凑凑热闹,赚赚人气.</p> <p>我觉得<a href="http://www.cnblogs.com/JeffreyZhao/" target="_blank">老赵 </a>之所谓觉得实施TDD很困惑,主要是没有把握好"Test Driven"和"Test First"之间的差别. 我们这里先不下结论.先演示我根据自己的理解,利用测试驱动开发SearchCriteriaBinder的过程.<br /></p> <p>1. 任务需求<br /></p> <fieldset>构建一个Model Binder。ASP.NET MVC中Model Binder的职责是根据请求的数据来生成Action方法的参数（即构建一个对象）。那么这次，我们将为负责产品搜索的Action方法提供一个SearchCriteria参数作为查询条件</fieldset>  <p>2.设计Class和第一个Test Unit<br /></p> <p>相关的数据class: </p> <div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000;">&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> SearchCriteria<br /><img id="Codehighlighter1_36_163_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_36_163_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_36_163_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_36_163_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_36_163_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_36_163_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_36_163_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_36_163_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top">&nbsp;&nbsp;&nbsp; </span><span id="Codehighlighter1_36_163_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_36_163_Open_Text"><span style="color: #000000;">{<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> PriceRange Price;<br /><img id="Codehighlighter1_102_115_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_102_115_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_102_115_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_102_115_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_102_115_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_102_115_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_102_115_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_102_115_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;"> Keywords </span><span id="Codehighlighter1_102_115_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_102_115_Open_Text"><span style="color: #000000;">{ </span><span style="color: #0000ff;">get</span><span style="color: #000000;">; </span><span style="color: #0000ff;">set</span><span style="color: #000000;">; }</span></span><span style="color: #000000;"><br /><img id="Codehighlighter1_144_157_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_144_157_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_144_157_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_144_157_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_144_157_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_144_157_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_144_157_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_144_157_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Color Colors </span><span id="Codehighlighter1_144_157_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_144_157_Open_Text"><span style="color: #000000;">{ </span><span style="color: #0000ff;">get</span><span style="color: #000000;">; </span><span style="color: #0000ff;">set</span><span style="color: #000000;">; }</span></span><span style="color: #000000;"><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp; }</span></span><span style="color: #000000;"><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp; [Flags]<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">enum</span><span style="color: #000000;"> Color<br /><img id="Codehighlighter1_203_274_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_203_274_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_203_274_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_203_274_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_203_274_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_203_274_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_203_274_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_203_274_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top">&nbsp;&nbsp;&nbsp; </span><span id="Codehighlighter1_203_274_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_203_274_Open_Text"><span style="color: #000000;">{<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Red </span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">1</span><span style="color: #000000;">,<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Black </span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">1</span><span style="color: #000000;">,<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; White </span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">2</span><span style="color: #000000;"><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp; }</span></span><span style="color: #000000;"><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> PriceRange<br /><img id="Codehighlighter1_308_393_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_308_393_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_308_393_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_308_393_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_308_393_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_308_393_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_308_393_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_308_393_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top">&nbsp;&nbsp;&nbsp; </span><span id="Codehighlighter1_308_393_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_308_393_Open_Text"><span style="color: #000000;">{<br /><img id="Codehighlighter1_335_348_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_335_348_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_335_348_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_335_348_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_335_348_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_335_348_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_335_348_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_335_348_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">float</span><span style="color: #000000;"> Min </span><span id="Codehighlighter1_335_348_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_335_348_Open_Text"><span style="color: #000000;">{ </span><span style="color: #0000ff;">get</span><span style="color: #000000;">; </span><span style="color: #0000ff;">set</span><span style="color: #000000;">; }</span></span><span style="color: #000000;"><br /><img id="Codehighlighter1_374_387_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_374_387_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_374_387_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_374_387_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_374_387_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_374_387_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_374_387_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_374_387_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">float</span><span style="color: #000000;"> Max </span><span id="Codehighlighter1_374_387_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_374_387_Open_Text"><span style="color: #000000;">{ </span><span style="color: #0000ff;">get</span><span style="color: #000000;">; </span><span style="color: #0000ff;">set</span><span style="color: #000000;">; }</span></span><span style="color: #000000;"><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp; }</span></span><span style="color: #000000;"><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> SearchCriteriaBinder : IModelBinder<br /><img id="Codehighlighter1_452_633_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_452_633_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_452_633_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_452_633_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_452_633_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_452_633_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_452_633_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_452_633_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top">&nbsp;&nbsp;&nbsp; </span><span id="Codehighlighter1_452_633_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_452_633_Open_Text"><span style="color: #000000;">{<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;"> BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)<br /><img id="Codehighlighter1_567_627_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_567_627_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_567_627_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_567_627_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_567_627_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_567_627_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_567_627_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_567_627_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span id="Codehighlighter1_567_627_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_567_627_Open_Text"><span style="color: #000000;">{<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> NotImplementedException();<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></span><span style="color: #000000;"><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp; }</span></span><span style="color: #000000;"><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp; </span><span style="color: #008000;">//</span><span style="color: #008000;">由于没有安装MVC环境,所以这边用伪类代替,这个不影响我们的开发</span><span style="color: #008000;"><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">interface</span><span style="color: #000000;"> IModelBinder<br /><img id="Codehighlighter1_712_818_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_712_818_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_712_818_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_712_818_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_712_818_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_712_818_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_712_818_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_712_818_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top">&nbsp;&nbsp;&nbsp; </span><span id="Codehighlighter1_712_818_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_712_818_Open_Text"><span style="color: #000000;">{<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">object</span><span style="color: #000000;"> BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext);<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp; }</span></span><span style="color: #000000;"><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> ControllerContext<br /><img id="Codehighlighter1_859_866_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_859_866_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_859_866_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_859_866_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_859_866_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_859_866_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_859_866_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_859_866_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top">&nbsp;&nbsp;&nbsp; </span><span id="Codehighlighter1_859_866_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_859_866_Open_Text"><span style="color: #000000;">{<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp; }</span></span><span style="color: #000000;"><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> ModelBindingContext<br /><img id="Codehighlighter1_909_1001_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_909_1001_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_909_1001_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_909_1001_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_909_1001_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_909_1001_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_909_1001_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_909_1001_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top">&nbsp;&nbsp;&nbsp; </span><span id="Codehighlighter1_909_1001_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_909_1001_Open_Text"><span style="color: #000000;">{<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;"> RawValue<br /><img id="Codehighlighter1_950_995_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_950_995_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_950_995_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_950_995_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_950_995_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_950_995_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_950_995_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_950_995_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span id="Codehighlighter1_950_995_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_950_995_Open_Text"><span style="color: #000000;">{<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">get</span><span style="color: #000000;">;<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">set</span><span style="color: #000000;">;<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></span><span style="color: #000000;"><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp; }</span></span></div> <p>第一个TestUnit</p> <div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000;">&nbsp;&nbsp;&nbsp; [TestMethod()]<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;"> BindModelOne()<br /><img id="Codehighlighter1_62_698_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_62_698_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_62_698_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_62_698_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_62_698_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_62_698_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_62_698_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_62_698_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span id="Codehighlighter1_62_698_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_62_698_Open_Text"><span style="color: #000000;">{<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ControllerContext controllerContext </span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> ControllerContext();<br /><img id="Codehighlighter1_219_290_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_219_290_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_219_290_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_219_290_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_219_290_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_219_290_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_219_290_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_219_290_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ModelBindingContext modelBindingContext </span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> ModelBindingContext() </span><span id="Codehighlighter1_219_290_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_219_290_Open_Text"><span style="color: #000000;">{ RawValue </span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">keywords-hello%20world--price-100-200--color-black-red</span><span style="color: #800000;">"</span><span style="color: #000000;"> }</span></span><span style="color: #000000;">;<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SearchCriteria criteria </span><span style="color: #000000;">=</span><span style="color: #000000;"> (SearchCriteria)</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> SearchCriteriaBinder().BindModel(controllerContext, modelBindingContext);<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Assert.IsTrue(criteria.Keywords.Contains(</span><span style="color: #800000;">"</span><span style="color: #800000;">hello world</span><span style="color: #800000;">"</span><span style="color: #000000;">));<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Assert.IsTrue(criteria.Price.Min </span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">100</span><span style="color: #000000;">);<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Assert.IsTrue(criteria.Price.Max </span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">200</span><span style="color: #000000;">);<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Assert.IsTrue(criteria.Colors </span><span style="color: #000000;">==</span><span style="color: #000000;"> (Color.Black </span><span style="color: #000000;">|</span><span style="color: #000000;"> Color.Red));<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></span></div> <p>&nbsp;</p> <p>3.用例写好了,运行下用例,看它是否可以通过,不能通过就修改实现代码,让其通过测试.</p> <p>很显然,当前的代码是无法通过测试,所以我们修改下<span style="color: #000000;">SearchCriteriaBinder 的代码,让它可以通过这个测试.<br /></span></p> <div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000;">&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> SearchCriteriaBinder : IModelBinder<br /><img id="Codehighlighter1_57_344_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_57_344_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_57_344_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_57_344_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_57_344_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_57_344_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_57_344_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_57_344_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top">&nbsp;&nbsp;&nbsp; </span><span id="Codehighlighter1_57_344_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_57_344_Open_Text"><span style="color: #000000;">{<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;"> BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)<br /><img id="Codehighlighter1_172_338_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_172_338_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_172_338_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_172_338_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_172_338_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_172_338_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_172_338_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_172_338_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span id="Codehighlighter1_172_338_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_172_338_Open_Text"><span style="color: #000000;">{<br /><img id="Codehighlighter1_214_327_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_214_327_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_214_327_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_214_327_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_214_327_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_214_327_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_214_327_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_214_327_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> SearchCriteria() </span><span id="Codehighlighter1_214_327_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_214_327_Open_Text"><span style="color: #000000;">{ Keywords </span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">hello world</span><span style="color: #800000;">"</span><span style="color: #000000;">, Price </span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> PriceRange() </span><span id="Codehighlighter1_267_291_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_267_291_Open_Text"><span style="color: #000000;">{ Max </span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">200</span><span style="color: #000000;">, Min </span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">100</span><span style="color: #000000;"> }</span></span><span style="color: #000000;">, Colors </span><span style="color: #000000;">=</span><span style="color: #000000;"> Color.Black </span><span style="color: #000000;">|</span><span style="color: #000000;"> Color.Red }</span></span><span style="color: #000000;">;<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></span><span style="color: #000000;"><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp; }</span></span></div> <p>4. 运行测试用例,通过了.<br /></p> <p>5. 根据需求获取新的用例.<br /></p> <p>如果你再也提炼不出用例,则证明任务已经完成.目前这个需求明显还没有完成,现在只针对一个固定条件进行测试/实现,而看需求,这个条件是需要被泛化(generalization) 利用三角法(Triangulation)我们获得了一个新的测试用例.</p> <div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [TestMethod()]<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;"> BindModelTwo()<br /><img id="Codehighlighter1_66_676_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_66_676_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_66_676_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_66_676_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_66_676_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_66_676_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_66_676_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_66_676_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span id="Codehighlighter1_66_676_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_66_676_Open_Text"><span style="color: #000000;">{<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ControllerContext controllerContext </span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> ControllerContext();<br /><img id="Codehighlighter1_223_292_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_223_292_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_223_292_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_223_292_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_223_292_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_223_292_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_223_292_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_223_292_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ModelBindingContext modelBindingContext </span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> ModelBindingContext() </span><span id="Codehighlighter1_223_292_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_223_292_Open_Text"><span style="color: #000000;">{ RawValue </span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">keywords-hello%20cnblogs--price-200-300--color-White</span><span style="color: #800000;">"</span><span style="color: #000000;"> }</span></span><span style="color: #000000;">;<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SearchCriteria criteria </span><span style="color: #000000;">=</span><span style="color: #000000;"> (SearchCriteria)</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> SearchCriteriaBinder().BindModel(controllerContext, modelBindingContext);<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Assert.IsTrue(criteria.Keywords.Contains(</span><span style="color: #800000;">"</span><span style="color: #800000;">hello cnblogs</span><span style="color: #800000;">"</span><span style="color: #000000;">));<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Assert.IsTrue(criteria.Price.Min </span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">200</span><span style="color: #000000;">);<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Assert.IsTrue(criteria.Price.Max </span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">300</span><span style="color: #000000;">);<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Assert.IsTrue(criteria.Colors </span><span style="color: #000000;">==</span><span style="color: #000000;"> Color.White);<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></span></div> <p>&nbsp;</p> <p>6.获得新用例之后,先运行测试,失败,必须重写实现让用例通过.</p> <div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> SearchCriteriaBinder : IModelBinder<br /><img id="Codehighlighter1_54_2209_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_54_2209_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_54_2209_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_54_2209_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_54_2209_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_54_2209_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_54_2209_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_54_2209_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top">&nbsp;&nbsp;&nbsp; </span><span id="Codehighlighter1_54_2209_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_54_2209_Open_Text"><span style="color: #000000;">{<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;"> BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)<br /><img id="Codehighlighter1_169_2203_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_169_2203_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_169_2203_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_169_2203_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_169_2203_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_169_2203_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_169_2203_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_169_2203_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span id="Codehighlighter1_169_2203_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_169_2203_Open_Text"><span style="color: #000000;">{<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000;">//</span><span style="color: #008000;">throw new NotImplementedException();<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000;">//</span><span style="color: #008000;">return new SearchCriteria() { Keywords = "hello world", Price = new PriceRange() { Max = 200, Min = 100 }, Colors = Color.Black | Color.Red };</span><span style="color: #008000;"><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var rawValue </span><span style="color: #000000;">=</span><span style="color: #000000;"> bindingContext.RawValue;<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var text </span><span style="color: #000000;">=</span><span style="color: #000000;"> HttpUtility.UrlDecode(rawValue.ToString());<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_554_562_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_554_562_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_554_562_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_554_562_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_554_562_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_554_562_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_554_562_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_554_562_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var tokenGroups </span><span style="color: #000000;">=</span><span style="color: #000000;"> text.Split(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">[] </span><span id="Codehighlighter1_554_562_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_554_562_Open_Text"><span style="color: #000000;">{ </span><span style="color: #800000;">"</span><span style="color: #800000;">--</span><span style="color: #800000;">"</span><span style="color: #000000;"> }</span></span><span style="color: #000000;">, StringSplitOptions.None).ToList();<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_700_707_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_700_707_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_700_707_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_700_707_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_700_707_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_700_707_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_700_707_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_700_707_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var fieldTokens </span><span style="color: #000000;">=</span><span style="color: #000000;"> tokenGroups.ToDictionary(g </span><span style="color: #000000;">=&gt;</span><span style="color: #000000;"> g.ToLowerInvariant().Split(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">[] </span><span id="Codehighlighter1_700_707_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_700_707_Open_Text"><span style="color: #000000;">{ </span><span style="color: #800000;">"</span><span style="color: #800000;">-</span><span style="color: #800000;">"</span><span style="color: #000000;"> }</span></span><span style="color: #000000;">, StringSplitOptions.None)[</span><span style="color: #800080;">0</span><span style="color: #000000;">], g </span><span style="color: #000000;">=&gt;</span><span style="color: #000000;"> g.ToLowerInvariant().Split(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">[] </span><span id="Codehighlighter1_783_790_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_783_790_Open_Text"><span style="color: #000000;">{ </span><span style="color: #800000;">"</span><span style="color: #800000;">-</span><span style="color: #800000;">"</span><span style="color: #000000;"> }</span></span><span style="color: #000000;">, StringSplitOptions.None).Skip(</span><span style="color: #800080;">1</span><span style="color: #000000;">).ToList());<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var searchCriteria </span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> SearchCriteria();<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> values;<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (fieldTokens.TryGetValue(</span><span style="color: #800000;">"</span><span style="color: #800000;">keywords</span><span style="color: #800000;">"</span><span style="color: #000000;">, </span><span style="color: #0000ff;">out</span><span style="color: #000000;"> values))<br /><img id="Codehighlighter1_1006_1074_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1006_1074_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_1006_1074_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_1006_1074_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_1006_1074_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1006_1074_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_1006_1074_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_1006_1074_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span id="Codehighlighter1_1006_1074_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_1006_1074_Open_Text"><span style="color: #000000;">{<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; searchCriteria.Keywords </span><span style="color: #000000;">=</span><span style="color: #000000;"> values[</span><span style="color: #800080;">0</span><span style="color: #000000;">];<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></span><span style="color: #000000;"><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (fieldTokens.TryGetValue(</span><span style="color: #800000;">"</span><span style="color: #800000;">price</span><span style="color: #800000;">"</span><span style="color: #000000;">, </span><span style="color: #0000ff;">out</span><span style="color: #000000;"> values))<br /><img id="Codehighlighter1_1150_1355_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1150_1355_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_1150_1355_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_1150_1355_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_1150_1355_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1150_1355_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_1150_1355_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_1150_1355_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span id="Codehighlighter1_1150_1355_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_1150_1355_Open_Text"><span style="color: #000000;">{<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; searchCriteria.Price </span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> PriceRange<br /><img id="Codehighlighter1_1222_1340_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1222_1340_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_1222_1340_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_1222_1340_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_1222_1340_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1222_1340_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_1222_1340_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_1222_1340_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span id="Codehighlighter1_1222_1340_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_1222_1340_Open_Text"><span style="color: #000000;">{<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Min </span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">float</span><span style="color: #000000;">.Parse(values[</span><span style="color: #800080;">0</span><span style="color: #000000;">]),<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Max </span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">float</span><span style="color: #000000;">.Parse(values[</span><span style="color: #800080;">1</span><span style="color: #000000;">])<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></span><span style="color: #000000;">;<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></span><span style="color: #000000;"><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (fieldTokens.TryGetValue(</span><span style="color: #800000;">"</span><span style="color: #800000;">color</span><span style="color: #800000;">"</span><span style="color: #000000;">, </span><span style="color: #0000ff;">out</span><span style="color: #000000;"> values))<br /><img id="Codehighlighter1_1431_2156_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1431_2156_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_1431_2156_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_1431_2156_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_1431_2156_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1431_2156_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_1431_2156_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_1431_2156_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span id="Codehighlighter1_1431_2156_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_1431_2156_Open_Text"><span style="color: #000000;">{<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">foreach</span><span style="color: #000000;"> (var item </span><span style="color: #0000ff;">in</span><span style="color: #000000;"> values)<br /><img id="Codehighlighter1_1494_2141_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1494_2141_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_1494_2141_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_1494_2141_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_1494_2141_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1494_2141_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_1494_2141_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_1494_2141_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span id="Codehighlighter1_1494_2141_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_1494_2141_Open_Text"><span style="color: #000000;">{<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">switch</span><span style="color: #000000;"> (item)<br /><img id="Codehighlighter1_1550_2123_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1550_2123_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_1550_2123_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_1550_2123_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_1550_2123_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1550_2123_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_1550_2123_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_1550_2123_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span id="Codehighlighter1_1550_2123_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_1550_2123_Open_Text"><span style="color: #000000;">{<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">red</span><span style="color: #800000;">"</span><span style="color: #000000;">:<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; searchCriteria.Colors </span><span style="color: #000000;">=</span><span style="color: #000000;"> searchCriteria.Colors </span><span style="color: #000000;">|</span><span style="color: #000000;"> Color.Red;<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">black</span><span style="color: #800000;">"</span><span style="color: #000000;">:<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; searchCriteria.Colors </span><span style="color: #000000;">=</span><span style="color: #000000;"> searchCriteria.Colors </span><span style="color: #000000;">|</span><span style="color: #000000;"> Color.Black;<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">white</span><span style="color: #800000;">"</span><span style="color: #000000;">:<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; searchCriteria.Colors </span><span style="color: #000000;">=</span><span style="color: #000000;"> searchCriteria.Colors </span><span style="color: #000000;">|</span><span style="color: #000000;"> Color.White;<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">default</span><span style="color: #000000;">:<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></span><span style="color: #000000;"><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></span><span style="color: #000000;"><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></span><span style="color: #000000;"><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> searchCriteria;<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></span><span style="color: #000000;"><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp; }</span></span></div> <p>&nbsp;</p> <p>7. 重新运行两个测试用例,已经可以通过.<br /></p> <p>8. 重复5~7. 直到没有新的测试用例可以新增,任务完成.<br /></p> <p>&nbsp;&nbsp;&nbsp; 这边的测试用例,还有一个测试类别和完整性的问题.我们后面再讨论. <br /></p> <p>9.重构,完善代码.</p> <p>&nbsp;&nbsp; 到了这一步,算是一个里程碑,接下来的步骤就会发生分歧.<br /></p> <fieldset>吉日说:任务完成了,可以提交给客人.</fieldset>  <fieldset>老赵说:代码好丑陋,毫无设计可言.</fieldset>  <p>&nbsp;&nbsp; 哈哈,调侃一下.TDD不仅仅是驱动开发,同时也有重构,完善代码的步骤(Test-Code-Test-Refactoring-Test-Code)<br /></p> <p>&nbsp;&nbsp; 重构就是在不改变可见行为的情况下,整理代码,去除坏味道,使其更加清晰可读.所以我们重构代码如下</p> <div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000;">&nbsp; </span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> SearchCriteriaBinder : IModelBinder<br /><img id="Codehighlighter1_55_2547_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_55_2547_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_55_2547_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_55_2547_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_55_2547_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_55_2547_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_55_2547_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_55_2547_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top">&nbsp;&nbsp;&nbsp; </span><span id="Codehighlighter1_55_2547_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_55_2547_Open_Text"><span style="color: #000000;">{<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;"> BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)<br /><img id="Codehighlighter1_170_657_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_170_657_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_170_657_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_170_657_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_170_657_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_170_657_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_170_657_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_170_657_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span id="Codehighlighter1_170_657_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_170_657_Open_Text"><span style="color: #000000;">{<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000;">//</span><span style="color: #008000;">throw new NotImplementedException();<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000;">//</span><span style="color: #008000;">return new SearchCriteria() { Keywords = "hello world", Price = new PriceRange() { Max = 200, Min = 100 }, Colors = Color.Black | Color.Red };</span><span style="color: #008000;"><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var rawValue </span><span style="color: #000000;">=</span><span style="color: #000000;"> bindingContext.RawValue;<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var text </span><span style="color: #000000;">=</span><span style="color: #000000;"> HttpUtility.UrlDecode(rawValue.ToString());<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var tokenGroups </span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.Tokenize(text);<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var searchCriteria </span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.Build(tokenGroups);<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> searchCriteria;<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></span><span style="color: #000000;"><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp; <br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> List</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> Tokenize(</span><span style="color: #0000ff;">string</span><span style="color: #000000;"> text)<br /><img id="Codehighlighter1_723_865_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_723_865_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_723_865_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_723_865_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_723_865_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_723_865_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_723_865_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_723_865_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span id="Codehighlighter1_723_865_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_723_865_Open_Text"><span style="color: #000000;">{<br /><img id="Codehighlighter1_779_787_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_779_787_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_779_787_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_779_787_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_779_787_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_779_787_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_779_787_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_779_787_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var tokenGroups </span><span style="color: #000000;">=</span><span style="color: #000000;"> text.Split(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">[] </span><span id="Codehighlighter1_779_787_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_779_787_Open_Text"><span style="color: #000000;">{ </span><span style="color: #800000;">"</span><span style="color: #800000;">--</span><span style="color: #800000;">"</span><span style="color: #000000;"> }</span></span><span style="color: #000000;">, StringSplitOptions.None).ToList();<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> tokenGroups;<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></span><span style="color: #000000;"><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> SearchCriteria Build(List</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> tokenGroups)<br /><img id="Codehighlighter1_938_2541_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_938_2541_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_938_2541_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_938_2541_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_938_2541_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_938_2541_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_938_2541_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_938_2541_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span id="Codehighlighter1_938_2541_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_938_2541_Open_Text"><span style="color: #000000;">{<br /><img id="Codehighlighter1_1040_1047_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1040_1047_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_1040_1047_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_1040_1047_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_1040_1047_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1040_1047_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_1040_1047_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_1040_1047_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var fieldTokens </span><span style="color: #000000;">=</span><span style="color: #000000;"> tokenGroups.ToDictionary(g </span><span style="color: #000000;">=&gt;</span><span style="color: #000000;"> g.ToLowerInvariant().Split(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">[] </span><span id="Codehighlighter1_1040_1047_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_1040_1047_Open_Text"><span style="color: #000000;">{ </span><span style="color: #800000;">"</span><span style="color: #800000;">-</span><span style="color: #800000;">"</span><span style="color: #000000;"> }</span></span><span style="color: #000000;">, StringSplitOptions.None)[</span><span style="color: #800080;">0</span><span style="color: #000000;">], g </span><span style="color: #000000;">=&gt;</span><span style="color: #000000;"> g.ToLowerInvariant().Split(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">[] </span><span id="Codehighlighter1_1123_1130_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_1123_1130_Open_Text"><span style="color: #000000;">{ </span><span style="color: #800000;">"</span><span style="color: #800000;">-</span><span style="color: #800000;">"</span><span style="color: #000000;"> }</span></span><span style="color: #000000;">, StringSplitOptions.None).Skip(</span><span style="color: #800080;">1</span><span style="color: #000000;">).ToList());<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var searchCriteria </span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> SearchCriteria();<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> values;<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (fieldTokens.TryGetValue(</span><span style="color: #800000;">"</span><span style="color: #800000;">keywords</span><span style="color: #800000;">"</span><span style="color: #000000;">, </span><span style="color: #0000ff;">out</span><span style="color: #000000;"> values))<br /><img id="Codehighlighter1_1346_1414_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1346_1414_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_1346_1414_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_1346_1414_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_1346_1414_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1346_1414_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_1346_1414_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_1346_1414_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span id="Codehighlighter1_1346_1414_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_1346_1414_Open_Text"><span style="color: #000000;">{<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; searchCriteria.Keywords </span><span style="color: #000000;">=</span><span style="color: #000000;"> values[</span><span style="color: #800080;">0</span><span style="color: #000000;">];<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></span><span style="color: #000000;"><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (fieldTokens.TryGetValue(</span><span style="color: #800000;">"</span><span style="color: #800000;">price</span><span style="color: #800000;">"</span><span style="color: #000000;">, </span><span style="color: #0000ff;">out</span><span style="color: #000000;"> values))<br /><img id="Codehighlighter1_1490_1695_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1490_1695_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_1490_1695_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_1490_1695_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_1490_1695_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1490_1695_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_1490_1695_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_1490_1695_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span id="Codehighlighter1_1490_1695_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_1490_1695_Open_Text"><span style="color: #000000;">{<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; searchCriteria.Price </span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> PriceRange<br /><img id="Codehighlighter1_1562_1680_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1562_1680_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_1562_1680_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_1562_1680_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_1562_1680_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1562_1680_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_1562_1680_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_1562_1680_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span id="Codehighlighter1_1562_1680_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_1562_1680_Open_Text"><span style="color: #000000;">{<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Min </span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">float</span><span style="color: #000000;">.Parse(values[</span><span style="color: #800080;">0</span><span style="color: #000000;">]),<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Max </span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">float</span><span style="color: #000000;">.Parse(values[</span><span style="color: #800080;">1</span><span style="color: #000000;">])<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></span><span style="color: #000000;">;<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></span><span style="color: #000000;"><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (fieldTokens.TryGetValue(</span><span style="color: #800000;">"</span><span style="color: #800000;">color</span><span style="color: #800000;">"</span><span style="color: #000000;">, </span><span style="color: #0000ff;">out</span><span style="color: #000000;"> values))<br /><img id="Codehighlighter1_1771_2496_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1771_2496_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_1771_2496_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_1771_2496_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_1771_2496_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1771_2496_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_1771_2496_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_1771_2496_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span id="Codehighlighter1_1771_2496_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_1771_2496_Open_Text"><span style="color: #000000;">{<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">foreach</span><span style="color: #000000;"> (var item </span><span style="color: #0000ff;">in</span><span style="color: #000000;"> values)<br /><img id="Codehighlighter1_1834_2481_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1834_2481_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_1834_2481_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_1834_2481_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_1834_2481_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1834_2481_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_1834_2481_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_1834_2481_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span id="Codehighlighter1_1834_2481_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_1834_2481_Open_Text"><span style="color: #000000;">{<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">switch</span><span style="color: #000000;"> (item)<br /><img id="Codehighlighter1_1890_2463_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1890_2463_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_1890_2463_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_1890_2463_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_1890_2463_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1890_2463_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_1890_2463_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_1890_2463_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span id="Codehighlighter1_1890_2463_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_1890_2463_Open_Text"><span style="color: #000000;">{<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">red</span><span style="color: #800000;">"</span><span style="color: #000000;">:<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; searchCriteria.Colors </span><span style="color: #000000;">=</span><span style="color: #000000;"> searchCriteria.Colors </span><span style="color: #000000;">|</span><span style="color: #000000;"> Color.Red;<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">black</span><span style="color: #800000;">"</span><span style="color: #000000;">:<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; searchCriteria.Colors </span><span style="color: #000000;">=</span><span style="color: #000000;"> searchCriteria.Colors </span><span style="color: #000000;">|</span><span style="color: #000000;"> Color.Black;<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">white</span><span style="color: #800000;">"</span><span style="color: #000000;">:<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; searchCriteria.Colors </span><span style="color: #000000;">=</span><span style="color: #000000;"> searchCriteria.Colors </span><span style="color: #000000;">|</span><span style="color: #000000;"> Color.White;<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">default</span><span style="color: #000000;">:<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></span><span style="color: #000000;"><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></span><span style="color: #000000;"><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></span><span style="color: #000000;"><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> searchCriteria;<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></span><span style="color: #000000;"><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp; }</span></span></div> <p><br /></p> <p>&nbsp;&nbsp; 10.重构之后运行所有测试用例,保证逻辑(可见的行为)没有被更改,这就是测试用例的另一个作用,保证原先的业务逻辑不被更改.</p> <p>&nbsp;&nbsp; 11.私用对象是否应该被测试.<br /></p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 原则上来说,私用对象是不需要测试.如果你想对他进行测试,则应该将它抽象出来,独立作为一个需求.这样子才不需要增加/修改对象本身的行为(public/protected)从而破坏本来的业务行为. 我们依然以<span style="color: #000000;">SearchCriteriaBinder</span>为例,进行下一步动作.</p> <p>&nbsp;&nbsp; 12.抽象出新的对象出来,并重构原来的对象.<br /></p> <div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000;">&nbsp; </span><span style="color: #0000ff;">internal</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> Tokenizer <br /><img id="Codehighlighter1_44_170_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_44_170_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_44_170_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_44_170_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_44_170_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_44_170_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_44_170_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_44_170_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top">&nbsp;&nbsp;&nbsp; </span><span id="Codehighlighter1_44_170_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_44_170_Open_Text"><span style="color: #000000;">{<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> List</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> Tokenize(</span><span style="color: #0000ff;">string</span><span style="color: #000000;"> text)<br /><img id="Codehighlighter1_104_164_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_104_164_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_104_164_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_104_164_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_104_164_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_104_164_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_104_164_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_104_164_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span id="Codehighlighter1_104_164_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_104_164_Open_Text"><span style="color: #000000;">{<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> NotImplementedException();<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></span><span style="color: #000000;"><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp; }</span></span></div> <p>&nbsp;</p> <div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;"> BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)<br /><img id="Codehighlighter1_113_614_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_113_614_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_113_614_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_113_614_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_113_614_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_113_614_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_113_614_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_113_614_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span id="Codehighlighter1_113_614_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_113_614_Open_Text"><span style="color: #000000;">{<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000;">//</span><span style="color: #008000;">throw new NotImplementedException();<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000;">//</span><span style="color: #008000;">return new SearchCriteria() { Keywords = "hello world", Price = new PriceRange() { Max = 200, Min = 100 }, Colors = Color.Black | Color.Red };</span><span style="color: #008000;"><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var rawValue </span><span style="color: #000000;">=</span><span style="color: #000000;"> bindingContext.RawValue;<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var text </span><span style="color: #000000;">=</span><span style="color: #000000;"> HttpUtility.UrlDecode(rawValue.ToString());<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: red;">&nbsp;</span><span>var tokenGroups </span><span>=</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #ff0000;">this</span><span style="color: #ff0000;">.Tokenizer.Tokenize</span><span>(rawValue);</span><span style="color: #000000;"><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>var searchCriteria </span><span>=</span><span style="color: #000000;">&nbsp;</span><span>this</span><span>.Build(tokenGroups);</span><span style="color: #000000;"><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> searchCriteria;<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></span><span style="color: #000000;"><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #ff0000;">&nbsp; </span><span style="color: #ff0000;">private</span><span style="color: #ff0000;"> Tokenizer Tokenizer</span><span style="color: #000000;"><br /><img id="Codehighlighter1_661_706_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_661_706_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_661_706_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_661_706_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_661_706_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_661_706_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_661_706_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_661_706_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span id="Codehighlighter1_661_706_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_661_706_Open_Text"><span style="color: #000000;">{<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">get</span><span style="color: #000000;">;<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">set</span><span style="color: #000000;">;<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></span><span style="color: #000000;"><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000;">//</span><span style="color: #008000;">private List&lt;string&gt; Tokenize(string text)<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000;">//</span><span style="color: #008000;">{<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp; var tokenGroups = text.Split(new string[] { "--" }, StringSplitOptions.None).ToList();<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp; return tokenGroups;<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000;">//</span><span style="color: #008000;">}</span></div> <p>&nbsp;</p> <p>&nbsp; 13. 编写第一个Test Unit</p> <div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [TestMethod()]<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;"> TokenizeTestOne()<br /><img id="Codehighlighter1_67_615_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_67_615_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_67_615_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_67_615_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_67_615_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_67_615_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_67_615_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_67_615_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span id="Codehighlighter1_67_615_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_67_615_Open_Text"><span style="color: #000000;">{<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Tokenizer target </span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> Tokenizer(); <br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">string</span><span style="color: #000000;"> text </span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">keywords-hello world--price-100-200--color-black-red</span><span style="color: #800000;">"</span><span style="color: #000000;">;<br /><img id="Codehighlighter1_253_365_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_253_365_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_253_365_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_253_365_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_253_365_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_253_365_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_253_365_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_253_365_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> expected </span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> List</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span id="Codehighlighter1_253_365_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_253_365_Open_Text"><span style="color: #000000;">{ <br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #800000;">"</span><span style="color: #800000;">keywords-hello world</span><span style="color: #800000;">"</span><span style="color: #000000;">,<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #800000;">"</span><span style="color: #800000;">price-100-200</span><span style="color: #800000;">"</span><span style="color: #000000;">,<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #800000;">"</span><span style="color: #800000;">color-black-red</span><span style="color: #800000;">"</span><span style="color: #000000;">,<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></span><span style="color: #000000;">;<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> actual </span><span style="color: #000000;">=</span><span style="color: #000000;"> target.Tokenize(text);<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Assert.AreEqual(expected[</span><span style="color: #800080;">0</span><span style="color: #000000;">], actual[</span><span style="color: #800080;">0</span><span style="color: #000000;">]);<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Assert.AreEqual(expected[</span><span style="color: #800080;">1</span><span style="color: #000000;">], actual[</span><span style="color: #800080;">1</span><span style="color: #000000;">]);<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Assert.AreEqual(expected[</span><span style="color: #800080;">2</span><span style="color: #000000;">], actual[</span><span style="color: #800080;">2</span><span style="color: #000000;">]);<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></span></div> <p>14.因为重构了代码,所以必须运行所有的测试用例.你会发现除了新加的这个测试失败了,以前的用例都失败了.因为<span style="color: #000000;">Tokenizer</span>没有被实例化,所以我们修改下SearchCriteriaBinder的constructor</p> <div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> SearchCriteriaBinder()<br /><img id="Codehighlighter1_46_103_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_46_103_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_46_103_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_46_103_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_46_103_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_46_103_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_46_103_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_46_103_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span id="Codehighlighter1_46_103_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_46_103_Open_Text"><span style="color: #000000;">{<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.Tokenizer </span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> Tokenizer();<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></span></div> <p>&nbsp; 并实现Tokenizer的Tokenize方法<br /></p> <div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> List</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> Tokenize(</span><span style="color: #0000ff;">string</span><span style="color: #000000;"> text)<br /><img id="Codehighlighter1_55_248_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_55_248_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_55_248_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_55_248_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_55_248_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_55_248_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_55_248_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_55_248_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span id="Codehighlighter1_55_248_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_55_248_Open_Text"><span style="color: #000000;">{<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000;">//</span><span style="color: #008000;">throw new NotImplementedException();</span><span style="color: #008000;"><br /><img id="Codehighlighter1_162_170_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_162_170_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_162_170_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_162_170_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_162_170_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_162_170_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_162_170_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_162_170_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var tokenGroups </span><span style="color: #000000;">=</span><span style="color: #000000;"> text.Split(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">[] </span><span id="Codehighlighter1_162_170_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_162_170_Open_Text"><span style="color: #000000;">{ </span><span style="color: #800000;">"</span><span style="color: #800000;">--</span><span style="color: #800000;">"</span><span style="color: #000000;"> }</span></span><span style="color: #000000;">, StringSplitOptions.None).ToList();<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> tokenGroups;<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></span></div> <p>&nbsp; 15. 重新运行所有的测试用例,通过</p> <p>&nbsp; 16. 接下来泛化Tokenizer的参数,重新添加测试用例,重复之前的步骤.(至于build要重构也是类似的步骤). </p> <p>&nbsp;</p> <p>以上的步骤,就是我理解中的TDD的开发顺序.你可以下载演示代码自己进行尝试</p> <p><a href="http://cid-af3411fff50fdeaa.skydrive.live.com/embedicon.aspx/Public/Demo/SearchCriteriaBinder.rar" target="_blank">http://cid-af3411fff50fdeaa.skydrive.live.com/embedicon.aspx/Public/Demo/SearchCriteriaBinder.rar </a></p> <p>接下来,稍微八下理论方面的看法.</p> <p>&nbsp;&nbsp;&nbsp; 在老赵的文中,基本上是他已经先设计好了实现的思路/设计,然后再写出对应的测试用例,接下来进行编码.(好多"<span style="color: red;">我想要单元测试</span>",哈哈).以这样子的步骤进行TDD的开发,肯定是不会对原有的开发流程起到辅助作用的,相反,反而会增加很多负担,完全没办法发挥TDD的好处. 也就是老赵其实用的是"Test first",而不是靠Test来Dirven development的. 所以实践起来就觉得别扭.<br /></p> <p>&nbsp;&nbsp;&nbsp; 难道,TDD都要这样子一步步来嘛?我设计能力比较强,一下子就可以把整体的轮廓都设计出来,总不能让我倒退回去,像菜鸟一样一步一步来吧?<br /></p> <p>&nbsp;&nbsp;&nbsp; 没错,TDD是提倡小步前进,逐步测试,逐步实现. 但是其实这里面有步子迈得多大的问题. 步子迈得越大,就要求更好的综合设计能力/全局把握能力.<br /></p> <p>&nbsp;&nbsp;&nbsp; 举个简单的例子. 如果刚开始TDD,或者对刚学开发的同学来说,他肯定是按照上面的步骤一步步来更保险的,但是对于一般熟练的人员来说,他就可以直接泛化参数,一下子写好两个测试用例.然后再通过两个用例直接驱动出实现来.&nbsp;&nbsp;&nbsp; 所以这个步子的大小完全取决于你对自己能力的定位^_^,有人只能一步跨过一条水沟,但是有人就是可以一步跳到河对岸,人比人气死人哦,千万别去比<img alt="" src="http://www.cnblogs.com/Emoticons/others/think001.gif" /></p> <p>&nbsp;&nbsp; 另外一个问题,就是测试的完整性/覆盖率. 其实测试分类别的,一些是上层测试,一些是下层测试,如果你硬要把它们和在一起,会累死人的.比如上面的SearchCriteriaBinder的两个测试用例,从业务层面(上层),他们已经可以完整体现任务的需求,所以已经算是完整了. 如果你硬要把参数为空/参数结构非法也加进来,那应该让他们来驱动什么业务呢? 这些底层测试,是可以外包给类库,或者内部消化的. 你不能用他们来体现业务,驱动开发,当然也不是绝对的,可能某些特殊的情况正是业务需求也不一定.<br /></p> <p>&nbsp;&nbsp; 还有另外一个典型的说法,就是阿不在帖子中回复说的<br /></p> <p><span id="comment_body_1675532"></span></p> <fieldset><span id="comment_body_1675532">阿不：<br /></span><span id="comment_body_1675532">从老赵的这篇文章能够体会到，我自己平常很难在项目中实践单元测试开发的一个重要的症结在于设计和抽象能力的不足。</span><span id="comment_body_1675532"></span><br /></fieldset>  <p>&nbsp;</p> <p>这样子的结果就是因为步子太大了,所以对全局观的把握能力要求太高了,导致自己觉得力不从心,好像能力不足的样子.也可是说,这样子的开发不是用测试用例驱动开发而得到的,而是需求经过脑袋(经验)进行整体设计之后,再往TDD上靠,自然就力不从心了,那么大的系统,脑袋的运算量毕竟有限啊.</p> <p>&nbsp;</p> <p>总得来说,我认为要实践TDD,必须把握好二件事情:</p> <p>1. 需求决定用例</p> <p>2. 用例驱动开发.</p> <p>特别是<span style="color: #0000ff;">用例</span><span style="color: red;">驱动</span><span style="color: #0000ff;">开发</span>,它就是我们通常说的"先有用例,再有实现",实现是用例驱动出来的,不是你脑袋先想出来的.脑袋想的应该是行为,比如<span style="color: #000000;">SearchCriteriaBinder</span>的<span style="color: #000000;">BindModel</span>方法.为了养成这种习惯,必须牢记一句话,从javaeye的gigix那边听来的"do the simplest thing to make the test pass, not the most stupid thing", 这也就是为什么我们为了通过第一个测试,直接hardcode的原因</p> <p><span style="color: #0000ff;">Test Driven 和Test First是两个完全不一样的概念,目的不一样,效果也不一样.</span></p> <div class="copyright"> <p>本文基于<a target="_blank" href="http://creativecommons.org/licenses/by/2.5/cn/">署名 2.5 中国大陆</a>许可协议发布，正品行货，如有雷同，皆为山寨，作者保留追究权利，但是在保留本文的署名<a target="_blank" href="http://www.cnblogs.com/walkingboy/">陈达艺</a>（包含链接的情况下,允许进行转载，演绎或用于商业目的。如您有任何疑问或者授权方面的协商，请<a target="_blank" href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#108;&#97;&#110;&#103;&#122;&#105;&#46;&#116;&#101;&#99;&#104;&#64;&#103;&#109;&#97;&#105;&#108;&#46;&#99;&#111;&#109;">E-Mail</a>/<a target="_blank" href="msnim:chat?contact=cnlangzi@live.com">MSN</a>联系我。</p></div><img src="http://www.cnblogs.com/walkingboy/aggbug/1587070.html?type=1" width="1" height="1" alt=""/><p>评论: 18　<a href="http://www.cnblogs.com/walkingboy/archive/2009/10/20/test_driven_or_test_first.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/walkingboy/archive/2009/10/20/test_driven_or_test_first.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56814/" target="_blank">Sun前CEO欲写自传 称经济危机是Sun被购主因</a><span style="color:gray">(2010-02-10 11:25)</span><br/>· <a href="http://news.cnblogs.com/n/56812/" target="_blank">Google社会化产品Buzz发布会实录</a><span style="color:gray">(2010-02-10 11:15)</span><br/>· <a href="http://news.cnblogs.com/n/56813/" target="_blank">福布斯：苹果生态产业链上的十大企业</a><span style="color:gray">(2010-02-10 11:14)</span><br/>· <a href="http://news.cnblogs.com/n/56811/" target="_blank">纽约时报：Google凭借Buzz进军社交网络</a><span style="color:gray">(2010-02-10 10:59)</span><br/>· <a href="http://news.cnblogs.com/n/56810/" target="_blank">百度视频公司龚宇：图文时代互联网竞争已定</a><span style="color:gray">(2010-02-10 10:56)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56812/" target="_blank">Google社会化产品Buzz发布会实录</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>[OpenSource] ScriptLoader V5:不一样的体验,客户端分布式缓存平台</title><link>http://www.cnblogs.com/walkingboy/archive/2009/01/13/ScriptLoaderV5.html</link><dc:creator>浪子</dc:creator><author>浪子</author><pubDate>Tue, 13 Jan 2009 13:15:00 GMT</pubDate><guid>http://www.cnblogs.com/walkingboy/archive/2009/01/13/ScriptLoaderV5.html</guid><description><![CDATA[<p>阅读: 2045 评论: 14 作者: <a href="http://www.cnblogs.com/walkingboy/" target="_blank">浪子</a> 发表于 2009-01-13 21:15 <a href="http://www.cnblogs.com/walkingboy/archive/2009/01/13/ScriptLoaderV5.html" target="_blank">原文链接</a></p><p><strong style="color: #0000ff;"></strong></p>
<p><strong style="color: #0000ff;"></strong></p>
<strong style="color: #0000ff;">前言</strong>
<p>&nbsp;&nbsp; ScriptLoader断断续续也开发了半年多了, 很多朋友都觉得这样的项目花俏多于实用, 其实有一个很重要的功能一直都没有开发,那就是我在<a id="AjaxHolder_ctl01_TitleUrl" href="http://www.cnblogs.com/walkingboy/archive/2008/06/13/ScriptLoaderV2.html">[OpenSource]ScriptLoaderV2:彻底改变你的编程习惯</a>提到过的ClientCacheManager.</p>
<p>&nbsp;&nbsp; 在开发中,每个人都或多或少的使用了Cache,为了减少数据库的负担,或者为了增加处理请求的速度.但是使用Cache也是一件很麻烦的事情,必须维护真实数据与缓存的同步,必须根据查询命中率判断Cache优先级有的放矢的删除低效缓存项,必须维护所有缓存对象的可序列化,必须维护服务器群集间的缓存同步......</p>
<p>&nbsp;&nbsp; 只不过,这些缓存的处理大部分都是在Server端.在RIA横行的今天,我们是否忽视了成千上万的客户端?当Ajax+Json支撑起很多系统的时候,我们是否应该可以更好的利用Browser的缓存机制来减少请求的次数,降低资源的消耗,获得更快的速度?</p>
<p>&nbsp;&nbsp; 客户端缓存的真正意义,在于减少网络请求,降低数据库查询,充分利用Server的内存,增加Application的吞吐量和请求处理效率,同时也可以提高客户端的响应速度,因为数据本来就存在客户端嘛^_^. 同时,缓存在客户端的东西,即使服务器重启亦可以持久保留.在现在这个大硬盘高内存为标配的PC时代,已经没啥人去手工清理IE缓存了,所以搞不好1年下来,它都一直用着同一个缓存呢:)<br />
</p>
<p>&nbsp;&nbsp; 基于ScriptLoader的缓存控制原理,ScriptLoaderV5,将带入走入这样一个被忽视的世界,带给你一个简单但用处颇多的客户端分布式缓存平台.<br />
</p>
<p>&nbsp;</p>
<p style="color: #0000ff;"><strong>插件接口</strong></p>
<p>&nbsp; ScriptLoader在V5之前,只能算是一个Library,但现在它已经成为一个小的Framework,它同样可以管理外部插入的ScriptObject对象,并管理其版本的更新.<br />
</p>
<p>IPlugin的定义很简单.<br />
</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">namespace</span><span style="color: #000000;">&nbsp;LangZi.Scripts<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">interface</span><span style="color: #000000;">&nbsp;IPlugin<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">Get&nbsp;the&nbsp;json&nbsp;data</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;GetContent();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">Get&nbsp;the&nbsp;last&nbsp;modified&nbsp;datetime&nbsp;of&nbsp;the&nbsp;live&nbsp;data</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DateTime&nbsp;GetLastModified();&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<p>&nbsp;&nbsp; </p>
<p><strong><span style="color: #0000ff;">公共方法</span></strong>:</p>
<p>&nbsp; 为了对Plugin进行管理,ScriptLoader同样新增了几个方法<br />
</p>
<p>&nbsp;<em> <strong>1.LoadPlugin</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp; </em>看得出来,跟以前版本中的LoadStylesheet一样,只是封装了下Load的方法而已<br />
</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 服务端: <br />
</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;LoadPlugin(</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;fileName)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;Load(fileName&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">.Plugin</span><span style="color: #800000;">"</span><span style="color: #000000;">);<br />
}</span></div>
<p>&nbsp;&nbsp;&nbsp; 客户端:</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">function</span><span style="color: #000000;">&nbsp;LoadPlugin(name){<br />
&nbsp;&nbsp;&nbsp;Load(name</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;">.plugin</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
}</span></div>
<p>&nbsp;</p>
<p>&nbsp; <em><strong>2.RefreshPlugin: </strong></em></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 手工更新某个指定的Plugin的数据和版本信息. 当然ScriptLoader还有一个自动的维护Plugin版本信息的轮询机制.<br />
</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;RefreshPlugin(</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;pluginName)</span></div>
<p> <br />
</p>
<p>&nbsp;<em><strong> 3.配置项: </strong></em><br />
</p>
<p>&nbsp; <u>Plugin版本更新的轮询间隔时间</u>:如果不配置,默认是180000;//30 minutes</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">appSettings</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">add&nbsp;</span><span style="color: #ff0000;">key</span><span style="color: #0000ff;">="VersionUpdateTime"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="50000"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">appSettings</span><span style="color: #0000ff;">&gt;</span></div>
<p>&nbsp; <u>Plugin部署配置</u><br />
</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">configSections</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">sectionGroup&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="LangZi"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">section&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="ScriptLoaders"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="System.Configuration.NameValueSectionHandler"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">sectionGroup</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">configSections</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">LangZi</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">ScriptLoaders</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">add&nbsp;</span><span style="color: #ff0000;">key</span><span style="color: #0000ff;">="Locations"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="ScriptLoader.Plugins.Location,ScriptLoader.Plugins"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">ScriptLoaders</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span>
<p><span style="color: #000000;">
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">LangZi</span><span style="color: #0000ff;">&gt;</span></p>
<p>&nbsp;</p>
</div>
<p>&nbsp;</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">httpHandlers</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">add&nbsp;</span><span style="color: #ff0000;">verb</span><span style="color: #0000ff;">="GET"</span><span style="color: #ff0000;">&nbsp;path</span><span style="color: #0000ff;">="*.plugin"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="LangZi.Scripts.ScriptLoaderHandler,LangZi.ScriptLoader"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">httpHandlers</span><span style="color: #0000ff;">&gt;</span></div>
<p>&nbsp;</p>
<p><strong style="color: #0000ff;">&nbsp;应用场景演示:</strong></p>
<p>&nbsp;我相信很多人都做过省市联动控件,举这样一个例子,每个人都会比较熟悉.所以我开发了一个演示性的Plugin:</p>
<p><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/walkingboy/ScriptLoader.Plugins.Location.jpg" width="367" height="474" />&nbsp;</p>
<p>&nbsp;<em><strong>Location.cs</strong></em></p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">using</span><span style="color: #000000;">&nbsp;System;<br />
</span><span style="color: #0000ff;">using</span><span style="color: #000000;">&nbsp;System.Collections.Generic;<br />
</span><span style="color: #0000ff;">using</span><span style="color: #000000;">&nbsp;System.Text;<br />
</span><span style="color: #0000ff;">using</span><span style="color: #000000;">&nbsp;LangZi.Scripts;<br />
</span><span style="color: #0000ff;">using</span><span style="color: #000000;">&nbsp;System.Xml;<br />
</span><span style="color: #0000ff;">using</span><span style="color: #000000;">&nbsp;System.Web;<br />
</span><span style="color: #0000ff;">using</span><span style="color: #000000;">&nbsp;System.IO;<br />
<br />
</span><span style="color: #0000ff;">namespace</span><span style="color: #000000;">&nbsp;ScriptLoader.Plugins<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Location:IPlugin<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">#region</span><span style="color: #000000;">&nbsp;IPlugin&nbsp;Members</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;GetContent()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuilder&nbsp;data&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;StringBuilder();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;"><br />
var&nbsp;locations&nbsp;=&nbsp;[{Name:'FuJian',City:[{Name:'XiaMen'},{Name:'FuZhou'}]&nbsp;}&nbsp;,{Name:'BeiJing',City:[{Name:'ChongWen'},{Name:'ChaoYang'}]}];&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data.Append(</span><span style="color: #800000;">"</span><span style="color: #800000;">var&nbsp;locations&nbsp;=&nbsp;[</span><span style="color: #800000;">"</span><span style="color: #000000;">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XmlDocument&nbsp;doc&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;XmlDocument();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;filename&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;System.AppDomain.CurrentDomain.BaseDirectory</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">location.xml</span><span style="color: #800000;">"</span><span style="color: #000000;">; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc.Load(filename);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XmlNode&nbsp;node&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;doc.SelectSingleNode(</span><span style="color: #800000;">"</span><span style="color: #800000;">/China</span><span style="color: #800000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i</span><span style="color: #000000;">=</span><span style="color: #800080;">0</span><span style="color: #000000;">;i</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">node.ChildNodes.Count;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XmlNode&nbsp;item&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;node.ChildNodes[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(i</span><span style="color: #000000;">==</span><span style="color: #800080;">0</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data.AppendFormat(</span><span style="color: #800000;">"</span><span style="color: #800000;">{{Name:'{0}',City:[</span><span style="color: #800000;">"</span><span style="color: #000000;">,&nbsp;item.Name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">0</span><span style="color: #000000;">;&nbsp;n&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;item.ChildNodes.Count;&nbsp;n</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XmlNode&nbsp;city&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;item.ChildNodes[n];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(n&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">0</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data.AppendFormat(</span><span style="color: #800000;">"</span><span style="color: #800000;">{{Name:'{0}'}}</span><span style="color: #800000;">"</span><span style="color: #000000;">,&nbsp;city.Name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data.AppendFormat(</span><span style="color: #800000;">"</span><span style="color: #800000;">,{{Name:'{0}'}}</span><span style="color: #800000;">"</span><span style="color: #000000;">,&nbsp;city.Name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data.Append(</span><span style="color: #800000;">"</span><span style="color: #800000;">]}</span><span style="color: #800000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data.AppendFormat(</span><span style="color: #800000;">"</span><span style="color: #800000;">,{{Name:'{0}',City:[</span><span style="color: #800000;">"</span><span style="color: #000000;">,&nbsp;item.Name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">0</span><span style="color: #000000;">;&nbsp;n&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;item.ChildNodes.Count;&nbsp;n</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XmlNode&nbsp;city&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;item.ChildNodes[n];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(n&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">0</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data.AppendFormat(</span><span style="color: #800000;">"</span><span style="color: #800000;">{{Name:'{0}'}}</span><span style="color: #800000;">"</span><span style="color: #000000;">,&nbsp;city.Name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data.AppendFormat(</span><span style="color: #800000;">"</span><span style="color: #800000;">,{{Name:'{0}'}}</span><span style="color: #800000;">"</span><span style="color: #000000;">,&nbsp;city.Name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data.Append(</span><span style="color: #800000;">"</span><span style="color: #800000;">]}</span><span style="color: #800000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data.Append(</span><span style="color: #800000;">"</span><span style="color: #800000;">];</span><span style="color: #800000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;data.ToString();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;DateTime&nbsp;GetLastModified()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;filename&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;System.AppDomain.CurrentDomain.BaseDirectory&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">location.xml</span><span style="color: #800000;">"</span><span style="color: #000000;">;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileInfo&nbsp;fi&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;FileInfo(filename);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;fi.LastWriteTime;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">#endregion</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
<p>&nbsp;</p>
<p><em><strong>Location.xml</strong></em></p>
<p> </p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;?</span><span style="color: #ff00ff;">xml&nbsp;version="1.0"&nbsp;encoding="utf-8"&nbsp;</span><span style="color: #0000ff;">?&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">China</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">FuJian</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">FuZhou</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">FuZhou</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">XiaMen</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">SiMing</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">SiMing</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">HuLi</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">HuLi</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">TongAn</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">TongAn</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">JiMei</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">JiMei</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">HaiCang</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">HaiCang</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">XiaMen</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">QuanZhou</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">AnXi</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">AnXi</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">NanAn</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">NanAn</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">YongChun</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">YongChun</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">JinJiang</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">JinJiang</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">ShiShi</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">ShiShi</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">QuanZhou</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">ZhangZhou</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">ZhangZhou</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">FuJian</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Shanghai</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">HuangPuQu</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">HuangPuQu</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">PuTuoQu</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">PuTuoQu</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">Shanghai</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">BeiJing</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">ChongWen</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">ChongWen</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">ChaoYang</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">ChaoYang</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">BeiJing</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">China</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span></div>
<p>&nbsp;</p>
<p><em><strong>消费Plugin:</strong></em><br />
</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;Page_Load(</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;sender,&nbsp;EventArgs&nbsp;e)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;LangZi.Scripts.ScriptLoader&nbsp;loader&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;LangZi.Scripts.ScriptLoader.RegisterInstance(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;loader.LoadPlugin(</span><span style="color: #800000;">"</span><span style="color: #800000;">Locations</span><span style="color: #800000;">"</span><span style="color: #000000;">);<br />
}</span></div>
<p>&nbsp;</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">html&nbsp;</span><span style="color: #ff0000;">xmlns</span><span style="color: #0000ff;">="http://www.w3.org/1999/xhtml"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">head&nbsp;</span><span style="color: #ff0000;">runat</span><span style="color: #0000ff;">="server"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">title</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">Untitled&nbsp;Page</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">title</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">script&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="text/javascript"</span><span style="color: #0000ff;">&gt;</span><span style="background-color: #f5f5f5; color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #f5f5f5; color: #0000ff;">function</span><span style="background-color: #f5f5f5; color: #000000;">&nbsp;Get(id){<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #f5f5f5; color: #0000ff;">return</span><span style="background-color: #f5f5f5; color: #000000;">&nbsp;document.getElementById(id);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #f5f5f5; color: #0000ff;">function</span><span style="background-color: #f5f5f5; color: #000000;">&nbsp;SelectedProvinceOnChange(value){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #f5f5f5; color: #0000ff;">var</span><span style="background-color: #f5f5f5; color: #000000;">&nbsp;currentProvince;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #f5f5f5; color: #0000ff;">for</span><span style="background-color: #f5f5f5; color: #000000;">(i</span><span style="background-color: #f5f5f5; color: #000000;">=</span><span style="background-color: #f5f5f5; color: #000000;">0</span><span style="background-color: #f5f5f5; color: #000000;">;i</span><span style="background-color: #f5f5f5; color: #000000;">&lt;</span><span style="background-color: #f5f5f5; color: #000000;">locations.length;i</span><span style="background-color: #f5f5f5; color: #000000;">++</span><span style="background-color: #f5f5f5; color: #000000;">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #f5f5f5; color: #0000ff;">if</span><span style="background-color: #f5f5f5; color: #000000;">(locations[i].Name&nbsp;</span><span style="background-color: #f5f5f5; color: #000000;">==</span><span style="background-color: #f5f5f5; color: #000000;">&nbsp;value){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;currentProvince&nbsp;</span><span style="background-color: #f5f5f5; color: #000000;">=</span><span style="background-color: #f5f5f5; color: #000000;">&nbsp;locations[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #f5f5f5; color: #0000ff;">break</span><span style="background-color: #f5f5f5; color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #f5f5f5; color: #0000ff;">var</span><span style="background-color: #f5f5f5; color: #000000;">&nbsp;cities&nbsp;</span><span style="background-color: #f5f5f5; color: #000000;">=</span><span style="background-color: #f5f5f5; color: #000000;">&nbsp;Get(</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">cities</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #f5f5f5; color: #0000ff;">for</span><span style="background-color: #f5f5f5; color: #000000;">(i&nbsp;</span><span style="background-color: #f5f5f5; color: #000000;">=</span><span style="background-color: #f5f5f5; color: #000000;">&nbsp;cities.options.length</span><span style="background-color: #f5f5f5; color: #000000;">-</span><span style="background-color: #f5f5f5; color: #000000;">1</span><span style="background-color: #f5f5f5; color: #000000;">;i</span><span style="background-color: #f5f5f5; color: #000000;">&gt;-</span><span style="background-color: #f5f5f5; color: #000000;">1</span><span style="background-color: #f5f5f5; color: #000000;">;i</span><span style="background-color: #f5f5f5; color: #000000;">--</span><span style="background-color: #f5f5f5; color: #000000;">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cities.options.remove(i)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #f5f5f5; color: #0000ff;">if</span><span style="background-color: #f5f5f5; color: #000000;">(currentProvince&nbsp;</span><span style="background-color: #f5f5f5; color: #000000;">!=</span><span style="background-color: #f5f5f5; color: #000000;">&nbsp;</span><span style="background-color: #f5f5f5; color: #0000ff;">null</span><span style="background-color: #f5f5f5; color: #000000;">){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #f5f5f5; color: #0000ff;">for</span><span style="background-color: #f5f5f5; color: #000000;">(i</span><span style="background-color: #f5f5f5; color: #000000;">=</span><span style="background-color: #f5f5f5; color: #000000;">0</span><span style="background-color: #f5f5f5; color: #000000;">;i</span><span style="background-color: #f5f5f5; color: #000000;">&lt;</span><span style="background-color: #f5f5f5; color: #000000;">currentProvince.City.length;i</span><span style="background-color: #f5f5f5; color: #000000;">++</span><span style="background-color: #f5f5f5; color: #000000;">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #f5f5f5; color: #0000ff;">var</span><span style="background-color: #f5f5f5; color: #000000;">&nbsp;option&nbsp;</span><span style="background-color: #f5f5f5; color: #000000;">=</span><span style="background-color: #f5f5f5; color: #0000ff;">new</span><span style="background-color: #f5f5f5; color: #000000;">&nbsp;Option(currentProvince.City[i].Name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cities.options.add(option);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #f5f5f5; color: #0000ff;">function</span><span style="background-color: #f5f5f5; color: #000000;">&nbsp;OnInit(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #f5f5f5; color: #0000ff;">var</span><span style="background-color: #f5f5f5; color: #000000;">&nbsp;Provinces&nbsp;</span><span style="background-color: #f5f5f5; color: #000000;">=</span><span style="background-color: #f5f5f5; color: #000000;">&nbsp;Get(</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">provinces</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #f5f5f5; color: #0000ff;">for</span><span style="background-color: #f5f5f5; color: #000000;">(i</span><span style="background-color: #f5f5f5; color: #000000;">=</span><span style="background-color: #f5f5f5; color: #000000;">0</span><span style="background-color: #f5f5f5; color: #000000;">;i</span><span style="background-color: #f5f5f5; color: #000000;">&lt;</span><span style="background-color: #f5f5f5; color: #000000;">locations.length;i</span><span style="background-color: #f5f5f5; color: #000000;">++</span><span style="background-color: #f5f5f5; color: #000000;">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #f5f5f5; color: #0000ff;">var</span><span style="background-color: #f5f5f5; color: #000000;">&nbsp;option&nbsp;</span><span style="background-color: #f5f5f5; color: #000000;">=</span><span style="background-color: #f5f5f5; color: #0000ff;">new</span><span style="background-color: #f5f5f5; color: #000000;">&nbsp;Option(locations[i].Name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Provinces.options.add(option);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SelectedProvinceOnChange(locations[</span><span style="background-color: #f5f5f5; color: #000000;">0</span><span style="background-color: #f5f5f5; color: #000000;">].Name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">script</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">head</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">body&nbsp;</span><span style="color: #ff0000;">onload</span><span style="color: #0000ff;">="OnInit()"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">form&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="form1"</span><span style="color: #ff0000;">&nbsp;runat</span><span style="color: #0000ff;">="server"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">div</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Province:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">select&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="provinces"</span><span style="color: #ff0000;">&nbsp;onchange</span><span style="color: #0000ff;">="SelectedProvinceOnChange(this.options[this.selectedIndex].text)"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">select</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;City:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">select&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="cities"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">select</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">asp:Button&nbsp;</span><span style="color: #ff0000;">ID</span><span style="color: #0000ff;">="Button1"</span><span style="color: #ff0000;">&nbsp;runat</span><span style="color: #0000ff;">="server"</span><span style="color: #ff0000;">&nbsp;onclick</span><span style="color: #0000ff;">="Button1_Click"</span><span style="color: #ff0000;">&nbsp;Text</span><span style="color: #0000ff;">="Button"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">div</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">form</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">body</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">html</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span></div>
<p>&nbsp;</p>
<p style="color: #0000ff;"><strong>远期计划</strong><br />
</p>
<p>&nbsp; &nbsp; ScriptLoader开发到这个版本,已经接近我的思维极限了,后续的开发暂时找不出更大的突破,或许只是小修小补,比如对缓存的控制进一步精细,把目前的缓存控制周期进行分割,新增其他的周期,例如基于Page的周期(比Context长,但是比Session短,离开页面即失效).或者将ScriptObject的范畴扩展出去,包括任何Broswer可缓存的对象(image......).<br />
</p>
<p>&nbsp;&nbsp; 当然,基于组件的应用,那可想像的空间还是很大的,但这不能算是ScriptLoader的原生功能. <br />
</p>
<p>&nbsp;&nbsp; 所以说,如果到如今,你还找不到ScriptLoader在你的项目中的应用场景的话,那请忽略它,因为暂时我无能力再突破它,增加更新鲜的功能. <br />
</p>
<p>&nbsp;&nbsp; 09年,或许是我开源的一年,如果你对ScriptLoader不感兴趣,可以关注我的另一个开源项目<a target="_blank" title="LangZi.QuickCMS" href="http://code.google.com/p/langzi/">LangZi.QuickCMS</a>,当然目前这个项目只完成了一个组件LangZi.Web.UrlEngine,如果对UrlRewriter比较在乎的朋友,小瞄一下或许你会有不一样的收获^_^.</p>
<p><br />
</p>
<p><strong style="color: #0000ff;">资源下载</strong></p>
<p>&nbsp;&nbsp; 1.svn: <a target="_blank" href="https://scriptloader.svn.sourceforge.net/svnroot/scriptloader">https://scriptloader.svn.sourceforge.net/svnroot/scriptloader</a><br />
</p>
<p> &nbsp;&nbsp; 2.packages: <a target="_blank" href="http://code.google.com/p/langzi/downloads/list">http://code.google.com/p/langzi/downloads/list</a><br />
</p>
<p>&nbsp;</p><img src="http://www.cnblogs.com/walkingboy/aggbug/1375105.html?type=1" width="1" height="1" alt=""/><p>评论: 14　<a href="http://www.cnblogs.com/walkingboy/archive/2009/01/13/ScriptLoaderV5.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/walkingboy/archive/2009/01/13/ScriptLoaderV5.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56814/" target="_blank">Sun前CEO欲写自传 称经济危机是Sun被购主因</a><span style="color:gray">(2010-02-10 11:25)</span><br/>· <a href="http://news.cnblogs.com/n/56812/" target="_blank">Google社会化产品Buzz发布会实录</a><span style="color:gray">(2010-02-10 11:15)</span><br/>· <a href="http://news.cnblogs.com/n/56813/" target="_blank">福布斯：苹果生态产业链上的十大企业</a><span style="color:gray">(2010-02-10 11:14)</span><br/>· <a href="http://news.cnblogs.com/n/56811/" target="_blank">纽约时报：Google凭借Buzz进军社交网络</a><span style="color:gray">(2010-02-10 10:59)</span><br/>· <a href="http://news.cnblogs.com/n/56810/" target="_blank">百度视频公司龚宇：图文时代互联网竞争已定</a><span style="color:gray">(2010-02-10 10:56)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56812/" target="_blank">Google社会化产品Buzz发布会实录</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>[OpenSource] ScriptLoader V4:与组件系统共舞,让分享更清晰</title><link>http://www.cnblogs.com/walkingboy/archive/2009/01/09/ScriptLoaderV4.html</link><dc:creator>浪子</dc:creator><author>浪子</author><pubDate>Fri, 09 Jan 2009 15:29:00 GMT</pubDate><guid>http://www.cnblogs.com/walkingboy/archive/2009/01/09/ScriptLoaderV4.html</guid><description><![CDATA[<p>阅读: 1469 评论: 4 作者: <a href="http://www.cnblogs.com/walkingboy/" target="_blank">浪子</a> 发表于 2009-01-09 23:29 <a href="http://www.cnblogs.com/walkingboy/archive/2009/01/09/ScriptLoaderV4.html" target="_blank">原文链接</a></p><p style="font-weight: bold; color: #0000ff;">前言</p>
<p>&nbsp; 虽然ScriptLoader这个组件产生于一个基于组件部署的系统,但是其实它并没有完全实现预先的目标,和平台系统更好的协调工作.这次因为要将这个组件用在我的另一个正在开发的平台系统中,所以对整个组件进行了一次升级和完善,解决了原来一些遗留的问题,新增了某些功能.新的版本将能在平台和组件间更好的协调工作.<br />
</p>
<p>&nbsp;</p>
<p style="font-weight: bold; color: #0000ff;">主要更新</p>
<ol>
    <li>&nbsp;将使用的.Net Framework从3.5降为2.0.<br />
    &nbsp;&nbsp;&nbsp; 本来用3.5只是为了偷懒,用了LINQ的一些功能,比如LINQ To XML, LINQ To Object. 这样子也导致了部分人必须自己重新整理整个组件才能应用在其基于2.0的项目中.这次升级就直接把那些LINQ的代码重写了一遍,放弃使用LINQ语法.</li>
    <li>实现了原来支持多语言资源(js,js变量资源)载入的功能.</li>
    <li>实现了添加自定义namespace的功能,主要用于组件间的类库区分,便于各组件之间的协调,减少冲突的可能.</li>
    <li>增加自定义请求后缀名,解决某些IIS站点下,asp.net没办法捕获到.js/.css的httphanlder的bug.<br />
    </li>
    <li>修改了原来的某些bug,比如监视文件的变动.<br />
    </li>
</ol>
<p style="font-weight: bold; color: #0000ff;">功能演示</p>
<ul>
    <li><span style="font-weight: bold;">1.区分多语言自动载入相关js和js变量资源</span><br />
    先看下整个文件的组织<br />
    <img alt="" src="http://www.cnblogs.com/images/cnblogs_com/walkingboy/solution_explorer.jpg" width="371" height="573" /><br />
    这里面有几个逻辑判断点.<br />
    <span style="font-style: italic;">1.</span> 当WebForm1.aspx被请求的时候,会自动判断当前&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　　　　WebForm1.aspx.currentculture.js(WebForm1.aspx.zh-CN.js)是否存在,如果存在则载入.<br />
    如果不存在,则判断WebForm1.aspx.js是否存在,如果存在则载入.<br />
    <br />
    <span style="font-style: italic;">2.</span> 我把后缀名为.jsresx的称为js变量资源,它的载入机制和js的载入是一样的.先判断WebForm1.aspx.zh-CN.jsresx是否存在,再判断WebForm1.aspx.zh-CN.jsresx是否存在.<br />
    jsresx是一个xml文件,格式如下<br />
    <div class="cnblogs_code"><!--<br />
    <br />
    Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
    http://www.CodeHighlighter.com/<br />
    <br />
    --><span style="color: #0000ff;">&lt;?</span><span style="color: #ff00ff;">xml&nbsp;version="1.0"&nbsp;encoding="utf-8"&nbsp;</span><span style="color: #0000ff;">?&gt;</span><span style="color: #000000;"><br />
    </span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Variables</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
    &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">lang</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">中文</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">lang</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
    &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">浪子</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
    </span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">Variables</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
    </span></div>
    <br />
    载入页面之后,就会在页面生成两个变量<br />
    <div class="cnblogs_code"><!--<br />
    <br />
    Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
    http://www.CodeHighlighter.com/<br />
    <br />
    --><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;lang</span><span style="color: #000000;">=</span><span style="color: #000000;">'</span><span style="color: #000000;">中文</span><span style="color: #000000;">'</span><span style="color: #000000;">;<br />
    </span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">'</span><span style="color: #000000;">浪子</span><span style="color: #000000;">'</span><span style="color: #000000;">;</span></div>
    <br />
    至于如何配置让页面自动关联js,请查看以前的相关文章 <a id="homepage1_HomePageDays_DaysList_ctl01_DayItem_DayList_ctl00_TitleUrl" href="http://www.cnblogs.com/walkingboy/archive/2008/06/13/ScriptLoaderV2.html">[OpenSource]ScriptLoaderV2:彻底改变你的编程习惯</a> 或者 code.google.com上的相关<a target="_blank" href="http://code.google.com/p/langzi/wiki/LoadScriptAssociatedPage">wiki页面</a><br />
    <br />
    </li>
    <li><span style="font-weight: bold;">2.为某些js配置一个指定的namespace</span><br />
    1.一个平台系统可能本身会带有一些js类库,比如统一使用jquery/prototype等,这样子在组件系统中就没必要重复载入.<br />
    2.另外一种情况是,本身作为一个组件,你可能还会和其他系统公用到一部分相同的js类库,但是不是平台提供的.这样子,当两个组件被最终用户组合到一个页面的时候,会导致js的重复载入.<br />
    <br />
    而ScriptLoader原来配置js只有两个文件lib.config和user.config, 显然每个组件都需要这些配置文件,发布的时候,变成需要把内容整合到平台底下的这两个文件中,同时js也需要整合到根目录底下的Scripts里面.显然这样子对于组件的部署是很不方便的.<br />
    <br />
    在V4中,修改了这个机制,把原来的固定的配置文件(lib.config和user.config)取消,取而代之的是以.jsconfig为后缀名的xml文件,配置的格式基本上不变了,只增加了一个小的属性.<br />
    <br />
    举个例子说明,会更好理解些<br />
    <img alt="" src="http://www.cnblogs.com/images/cnblogs_com/walkingboy/script_settings.jpg" width="371" height="570" /><br />
    <br />
    lib.jsconfig<br />
    <div class="cnblogs_code"><!--<br />
    <br />
    Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
    http://www.CodeHighlighter.com/<br />
    <br />
    --><span style="color: #0000ff;">&lt;?</span><span style="color: #ff00ff;">xml&nbsp;version="1.0"&nbsp;encoding="utf-8"&nbsp;</span><span style="color: #0000ff;">?&gt;</span><span style="color: #000000;"><br />
    </span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Scripts</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
    &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Script&nbsp;</span><span style="color: #ff0000;">Name</span><span style="color: #0000ff;">="jquery"</span><span style="color: #ff0000;">&nbsp;Inherit</span><span style="color: #0000ff;">="jquery.min.js"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
    &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">Script</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
    </span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">Scripts</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
    </span></div>
    <br />
    scripts.jsconfig<br />
    <div class="cnblogs_code"><!--<br />
    <br />
    Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
    http://www.CodeHighlighter.com/<br />
    <br />
    --><span style="color: #0000ff;">&lt;?</span><span style="color: #ff00ff;">xml&nbsp;version="1.0"&nbsp;encoding="utf-8"&nbsp;</span><span style="color: #0000ff;">?&gt;</span><span style="color: #000000;"><br />
    </span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Scripts</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
    &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Script&nbsp;</span><span style="color: #ff0000;">Name</span><span style="color: #0000ff;">="MyScript"</span><span style="color: #ff0000;">&nbsp;Inherit</span><span style="color: #0000ff;">="myscript1.js"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">References</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Reference&nbsp;</span><span style="color: #ff0000;">Name</span><span style="color: #0000ff;">="demo2"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">Reference</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">References</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
    &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">Script</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
    &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Script&nbsp;</span><span style="color: #ff0000;">Name</span><span style="color: #0000ff;">="demo2"</span><span style="color: #ff0000;">&nbsp;Inherit</span><span style="color: #0000ff;">="demo2.js"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">References</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Reference&nbsp;</span><span style="color: #ff0000;">Name</span><span style="color: #0000ff;">="jquery"</span><span style="color: #ff0000;">&nbsp;Namespace</span><span style="color: #0000ff;">="lib"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">Reference</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">References</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
    &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">Script</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
    </span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">Scripts</span><span style="color: #0000ff;">&gt;</span></div>
    <br />
    在scripts.jsconfig中,demo2引用了jquery这个js,但是jquery被定义在另外一个jsconfig中,而且那个jsconfig被放在一个名为lib的文件夹底下. 所以必须增加一个namespace="lib".如果没有加这个namespace则表示引用的是当前jsconfig里的一个名为jquery的js.<br />
    <br />
    这段描述有点拗口.不过我们可以看得出来, namespace是和jsconfig所在的文件夹相对应的. 当一个jsconfig文件放在某个文件夹底下的时候,在这个jsconfig中配置的js都会被加上这个文件夹的名称作为一个前缀namespace,比如jquery这个js被定义在lib文件夹下的lib.jsconfig里面,所以在别的jsconfig引用它的时候,就必须标明是Namespace="lib", 而在lib.jsconfig中要引用jquery,则不需要多加这个属性,同一个jsconfig中的js默认为同一namespace底下.<br />
    不过有两种情况是不会自动添加文件夹名称作为namespace的:<br />
    <span style="font-style: italic;">1.程序根目录</span><br />
    <span style="font-style: italic;">2.Scrtipts文件夹内,这个是为了和以前的版本兼容</span><br />
    <br />
    css的载入也是同样的,文件夹会作为一个namespace加到name里面,除了根目录和Styles文件夹除外.比如<br />
    <img alt="" src="http://www.cnblogs.com/images/cnblogs_com/walkingboy/style_settings.jpg" width="386" height="430" /><br />
    则载入的代码就变为<br />
    <div class="cnblogs_code"><!--<br />
    <br />
    Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
    http://www.CodeHighlighter.com/<br />
    <br />
    --><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;Page_Load(</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;sender,&nbsp;EventArgs&nbsp;e)<br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LangZi.Scripts.ScriptLoader&nbsp;loader&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;LangZi.Scripts.ScriptLoader.RegisterInstance(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">);<br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loader.LoadStylesheet(</span><span style="color: #800000;">"</span><span style="color: #800000;">Stylesheet1</span><span style="color: #800000;">"</span><span style="color: #000000;">);<br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loader.LoadStylesheet(</span><span style="color: #800000;">"</span><span style="color: #800000;">Custom.Stylesheet2</span><span style="color: #800000;">"</span><span style="color: #000000;">);<br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
    <br />
    有了这个namespace,我们就可以容易的区分各个组件,每个组件使用自己的对应名称的文件夹,以后部署就不会存在冲突,而lib是一样的,即使部署上去了冲突了,也会被忽略掉一个.或者可以根据文件夹的深度来决定哪个要被抛弃,这个还没做实现代码:)<br />
    <br />
    其实这里还有一个重要的功能没有实现,就是类似<a title="JSI" target="_blank" href="http://www.cnblogs.com/walkingboy/admin/www.xidea.org/project/jsi/">JSI</a> 的冲突隔离,因为两个框架的关注点不一样,所以ScriptLoader暂时没有考虑这个功能,不过如果实现这个功能,将对组件的部署提供更稳健的保障,或许等待下一个版本:)<br />
    <br />
    </li>
    <li><span style="font-weight: bold;">3.自定义请求后缀名</span><br />
    上次在一个项目中,ScriptLoader的boot.js一直载入不成功,最终发现原来asp.net没有handle到js和css的请求,一直没发现IIS哪里有问题, 将请求后缀改为.aspx则可以成功捕获到.巨晕,所以就加了这个功能,如果你想使用自定义的请求后缀名的话,只需要在web.config中进行修改.<br />
    原来的配置是<br />
    <div class="cnblogs_code"><!--<br />
    <br />
    Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
    http://www.CodeHighlighter.com/<br />
    <br />
    --><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">httpHandlers</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
    &nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">add&nbsp;</span><span style="color: #ff0000;">verb</span><span style="color: #0000ff;">="GET"</span><span style="color: #ff0000;">&nbsp;path</span><span style="color: #0000ff;">="*.js"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="LangZi.Scripts.ScriptLoaderHandler,LangZi.ScriptLoader"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
    &nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">add&nbsp;</span><span style="color: #ff0000;">verb</span><span style="color: #0000ff;">="GET"</span><span style="color: #ff0000;">&nbsp;path</span><span style="color: #0000ff;">="*.css"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="LangZi.Scripts.ScriptLoaderHandler,LangZi.ScriptLoader"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
    </span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">httpHandlers</span><span style="color: #0000ff;">&gt;</span></div>
    <br />
    需要改为如下配置<br />
    <div class="cnblogs_code"><!--<br />
    <br />
    Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
    http://www.CodeHighlighter.com/<br />
    <br />
    --><span style="color: #0000ff;">&lt;?</span><span style="color: #ff00ff;">xml&nbsp;version="1.0"</span><span style="color: #0000ff;">?&gt;</span><span style="color: #000000;"><br />
    </span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">configuration</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
    &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">appSettings</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">add&nbsp;</span><span style="color: #ff0000;">key</span><span style="color: #0000ff;">="LoaderSuffix"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">=".aspx"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
    &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">appSettings</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
    &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">system.web</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">httpHandlers</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">add&nbsp;</span><span style="color: #ff0000;">verb</span><span style="color: #0000ff;">="GET"</span><span style="color: #ff0000;">&nbsp;path</span><span style="color: #0000ff;">="*.js.aspx"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="LangZi.Scripts.ScriptLoaderHandler,LangZi.ScriptLoader"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">add&nbsp;</span><span style="color: #ff0000;">verb</span><span style="color: #0000ff;">="GET"</span><span style="color: #ff0000;">&nbsp;path</span><span style="color: #0000ff;">="*.css.aspx"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="LangZi.Scripts.ScriptLoaderHandler,LangZi.ScriptLoader"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">httpHandlers</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp; <br />
    &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">system.web</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
    </span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">configuration</span><span style="color: #0000ff;">&gt;</span></div>
    <br />
    另外注意点的地方是,如果你使用页面手工注册boot.js的引入的,则需要更改script中的后缀,如<br />
    <div class="cnblogs_code"><!--<br />
    <br />
    Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
    http://www.CodeHighlighter.com/<br />
    <br />
    --><span style="color: #000000;">&lt;</span><span style="color: #000000;">script&nbsp;src</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">LangZi.Scripts.boot.js</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;charset</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">UTF-8</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;&nbsp;type</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">text/javascript</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;&lt;</span><span style="color: #000000;">/</span><span style="color: #000000;">script&gt;&nbsp; <br />
    </span></div>
    要修改为<br />
    <div class="cnblogs_code"><!--<br />
    <br />
    Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
    http://www.CodeHighlighter.com/<br />
    <br />
    --><span style="color: #000000;">&lt;</span><span style="color: #000000;">script&nbsp;src</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">LangZi.Scripts.boot.js.aspx</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;charset</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">UTF-8</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;&nbsp;type</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">text/javascript</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;&lt;</span><span style="color: #000000;">/</span><span style="color: #000000;">script&gt;&nbsp; <br />
    </span></div>
    <br />
    如果使用的是服务端的注册方式,则不需要更改代码.<br />
    <div class="cnblogs_code"><!--<br />
    <br />
    Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
    http://www.CodeHighlighter.com/<br />
    <br />
    --><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;Page_Load(</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;sender,&nbsp;EventArgs&nbsp;e)<br />
    {<br />
    &nbsp;&nbsp;&nbsp;LangZi.Scripts.ScriptLoader&nbsp;loader&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;LangZi.Scripts.ScriptLoader.RegisterInstance(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
    }</span></div>
    <br />
    <br />
    </li>
    <li>相关资源<br />
    1.部分文档已经增加到code.google.com的<a title="wiki页面" target="_blank" href="http://code.google.com/p/langzi/wiki/ScriptLoader">wiki页</a>上面,其他文档会陆续进行完善,欢迎使用中的朋友帮忙一起完善^_^<br />
    2.相关代码可以从&nbsp;<a target="_blank" href="http://code.google.com/p/langzi/downloads/list">http://code.google.com/p/langzi/downloads/list</a> 获取到<br />
    <br />
    <br />
    </li>
</ul><img src="http://www.cnblogs.com/walkingboy/aggbug/1373020.html?type=1" width="1" height="1" alt=""/><p>评论: 4　<a href="http://www.cnblogs.com/walkingboy/archive/2009/01/09/ScriptLoaderV4.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/walkingboy/archive/2009/01/09/ScriptLoaderV4.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56814/" target="_blank">Sun前CEO欲写自传 称经济危机是Sun被购主因</a><span style="color:gray">(2010-02-10 11:25)</span><br/>· <a href="http://news.cnblogs.com/n/56812/" target="_blank">Google社会化产品Buzz发布会实录</a><span style="color:gray">(2010-02-10 11:15)</span><br/>· <a href="http://news.cnblogs.com/n/56813/" target="_blank">福布斯：苹果生态产业链上的十大企业</a><span style="color:gray">(2010-02-10 11:14)</span><br/>· <a href="http://news.cnblogs.com/n/56811/" target="_blank">纽约时报：Google凭借Buzz进军社交网络</a><span style="color:gray">(2010-02-10 10:59)</span><br/>· <a href="http://news.cnblogs.com/n/56810/" target="_blank">百度视频公司龚宇：图文时代互联网竞争已定</a><span style="color:gray">(2010-02-10 10:56)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56812/" target="_blank">Google社会化产品Buzz发布会实录</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>利用Tor(The Onion Router,洋葱路由)访问Sourceforge</title><link>http://www.cnblogs.com/walkingboy/archive/2008/07/21/Tor_SourceForge.html</link><dc:creator>浪子</dc:creator><author>浪子</author><pubDate>Mon, 21 Jul 2008 15:59:00 GMT</pubDate><guid>http://www.cnblogs.com/walkingboy/archive/2008/07/21/Tor_SourceForge.html</guid><description><![CDATA[<p>阅读: 3865 评论: 13 作者: <a href="http://www.cnblogs.com/walkingboy/" target="_blank">浪子</a> 发表于 2008-07-21 23:59 <a href="http://www.cnblogs.com/walkingboy/archive/2008/07/21/Tor_SourceForge.html" target="_blank">原文链接</a></p><p>&nbsp;</p>
<p>&nbsp;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp; 今天看到</span> <a target="_blank" href="http://www.cnblogs.com/eaglet/"><span>eaglet</span></a><span> 的</span><span><span><span><a target="_blank" href="http://www.cnblogs.com/eaglet/archive/2008/07/21/1247298.html">SourceForge 的中文替代网站</a></span></span><span>发现现在不能访问</span></span><span>sourceforge的朋友不在少数.而且维护这样子一个镜像站点工作量相当艰巨,并且意义不是很大,在此分享下自己的代理方案.
</span></p>
<br />
<p><span><span>在回复中有人提出使用wj,确实wj是个不错的工具,不过相对来说,还有比较多的弊端</span>:
</span></p>
<ol>
    <li><span>wj本身是被封的站点和软件，xx信息太多，而且下载和更新都比较麻烦。
    </span></li>
    <li><span>wj虽然说进行了高强度的加密，号称超过银行标准，不过新版本出来之后经常过一阶段就被封禁。
    </span></li>
    <li><span>wj的代理速度比较慢。
    </span></li>
</ol>
<ol>
</ol>
<p><span>&nbsp;&nbsp;&nbsp; 然而除此之外，我们难道没有合理合法的代理工具嘛?有的,这就是我接下来要介绍的方案：Tor（The Onion Router，洋葱路由器）.
</span></p>
<p>&nbsp;</p>
<p>
</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;Tor是一种点对点的代理软件，依靠网络上的众多电脑运行的tor服务来提供代理(全球的Tor网络是一个分布式的、匿名的网络)。tor代理网络是自动连接并随机安排访问链路的，这样就没有了固定的代理服务器，也不需要去费劲寻找代理服务器地址了。而且Tor的代理一般在2-5层左右，加密程度也比较高。
</span></p>
<p><span>Tor的简明工作原理如下(具体可以查看<a target="_blank" href="http://www.torproject.org/overview.html.zh-cn">http://www.torproject.org/overview.html.zh-cn</a>,需要使用Tor后才可访问^_^):
</span></p>
<p><img src="http://images.cnblogs.com/cnblogs_com/walkingboy/072108_1544_TorSourcefo1.png" alt="" /><span>
</span></p>
<p><span>首先,Tor从目录服务器获取一个Tor的节点列表,加入到全球的Tor网络中.
</span></p>
<p>&nbsp;</p>
<p><span><img src="http://images.cnblogs.com/cnblogs_com/walkingboy/072108_1544_TorSourcefo2.png" alt="" />
</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;如需访问网络上的服务器，Tor则会随机的安排一条访问路线，通过几层的加密传输，然后在某个出口出来访问目标服务器。
</span></p>
<p>&nbsp;</p>
<p><span><img src="http://images.cnblogs.com/cnblogs_com/walkingboy/072108_1544_TorSourcefo3.png" alt="" />
</span></p>
<p><span>如需访问另一服务器，Tor则会安排另一条随机的线路来完成访问。
</span></p>
<p>
&nbsp;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;以前使用Tor是比较麻烦的,因为其安装步骤相当繁琐,不过现在已经不需要了,有一个叫<a target="_blank" href="http://vidalia-project.net/">Vidalia Bundle</a>的软件,提供Tor的整合安装方案,其中包括4个组件
</span></p>
<ol>
    <li><span>Tor的核心组件
    </span></li>
    <li><span>Tor的图形控制界面</span><br />
    <img src="http://images.cnblogs.com/cnblogs_com/walkingboy/072108_1544_TorSourcefo4.png" alt="" /><span>
    </span></li>
    <li><span>代理转换软件Privoxy，把Tor提供的socks代理转换为http代理</span><img src="http://images.cnblogs.com/cnblogs_com/walkingboy/072108_1544_TorSourcefo5.png" alt="" /><br />
    <br />
    <span>
    </span></li>
    <li><span>Torbutton，FireFox的插件，类似wj的Firefox插件，用来开关Tor功能
    </span></li>
</ol>
<p><img src="http://images.cnblogs.com/cnblogs_com/walkingboy/072108_1544_TorSourcefo6.png" alt="" width="679" height="509" /><span>
</span></p>
<ol>
</ol>
<p>&nbsp;
</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>当然如果你的软件没有代理功能，但是你又想通过Tor进行网络访问，你就需要一个老牌的代理封装软件：<a target="_blank" href="http://www.newhua.com/soft/6423.htm">SocksCap32</a>，该软件可以为任意软件提供网络访问的代理封装，不管被封装的软件自身带不带代理功能。</span></p>
<p>&nbsp;</p>
<p>&nbsp;
</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当Tor运转之后，就可以访问任意网站了，不过有几点要注意的：
</span></p>
<ol>
    <li><span>不要使用Tor进行大流量下载，特别是P2P下载，因为这样显得太不厚道了，Tor的中继服务器都是自愿者搭建的
    </span></li>
    <li><span>使用Tor，可能会导致你访问站点时候cookie丢失，需要重新登录，我想可能是因为Tor中转之后,每次在不同的出口点进行访问,导致cookie丢失,具体原因尚不是非常清楚.
    </span></li>
</ol>
<ol>
</ol>
<p>
&nbsp;</p>
<p>
&nbsp;</p>
<p><span>&nbsp;&nbsp;&nbsp; 更加详细的内容请访问一下站点：
</span></p>
<span>
</span>
<ol>
    <li><a target="_blank" href="http://www.tcno.net/doc/tor">http://www.tcno.net/doc/tor</a> <br />
    </li>
    <li><a target="_blank" href="http://vidalia-project.net/">http://vidalia-project.net</a> <br />
    </li>
    <li><a target="_blank" href="http://www.torproject.org/overview.html.zh-cn">http://www.torproject.org/overview.html.zh-cn</a>&nbsp;</li>
</ol>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span>
</span></p><img src="http://www.cnblogs.com/walkingboy/aggbug/1248209.html?type=1" width="1" height="1" alt=""/><p>评论: 13　<a href="http://www.cnblogs.com/walkingboy/archive/2008/07/21/Tor_SourceForge.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/walkingboy/archive/2008/07/21/Tor_SourceForge.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56814/" target="_blank">Sun前CEO欲写自传 称经济危机是Sun被购主因</a><span style="color:gray">(2010-02-10 11:25)</span><br/>· <a href="http://news.cnblogs.com/n/56812/" target="_blank">Google社会化产品Buzz发布会实录</a><span style="color:gray">(2010-02-10 11:15)</span><br/>· <a href="http://news.cnblogs.com/n/56813/" target="_blank">福布斯：苹果生态产业链上的十大企业</a><span style="color:gray">(2010-02-10 11:14)</span><br/>· <a href="http://news.cnblogs.com/n/56811/" target="_blank">纽约时报：Google凭借Buzz进军社交网络</a><span style="color:gray">(2010-02-10 10:59)</span><br/>· <a href="http://news.cnblogs.com/n/56810/" target="_blank">百度视频公司龚宇：图文时代互联网竞争已定</a><span style="color:gray">(2010-02-10 10:56)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56812/" target="_blank">Google社会化产品Buzz发布会实录</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>[OpenSource]ScriptLoaderV2:彻底改变你的编程习惯</title><link>http://www.cnblogs.com/walkingboy/archive/2008/06/13/ScriptLoaderV2.html</link><dc:creator>浪子</dc:creator><author>浪子</author><pubDate>Fri, 13 Jun 2008 05:24:00 GMT</pubDate><guid>http://www.cnblogs.com/walkingboy/archive/2008/06/13/ScriptLoaderV2.html</guid><description><![CDATA[<p>阅读: 2841 评论: 20 作者: <a href="http://www.cnblogs.com/walkingboy/" target="_blank">浪子</a> 发表于 2008-06-13 13:24 <a href="http://www.cnblogs.com/walkingboy/archive/2008/06/13/ScriptLoaderV2.html" target="_blank">原文链接</a></p><p><strong><span style="color: rgb(0, 16, 255);">摘要：</span></strong></p>
<blockquote>
<p><a href="http://www.cnblogs.com/walkingboy/archive/2008/06/09/ScriptLoader.html" target="_blank">[OpenSource]ScriptLoader: 轻松管理你的js 类库</a>一文发布后，有的园友反映，侵入性还是有点太强。昨天晚上半夜想到一个不错的点子，越想越睡不着，最终还是爬起来把ScriptLoader升级到了V2，这个版本将给你更便利的脚本文件组织体验，增加了自动关联、多语言支持途径、诱人的Syntactic Sugar，使用ScriptLoader将改变你以往的编程习惯^_^。</p>
</blockquote>
<p><strong><span style="color: rgb(0, 16, 255);">简介：</span></strong></p>
<blockquote>
<p>ScriptLoaderV2增加一些新特性：</p>
<ol>
    <li>对Aspx无侵入性的脚本引入机制。  </li>
    <li>多语言资源的支持途径。  </li>
    <li>让你更容易load module的Syntactic Sugar。 </li>
</ol>
<p>&nbsp;</p>
</blockquote>
<p><strong><span style="color: rgb(0, 16, 255);">无侵入的脚本引入机制：</span></strong></p>
<blockquote>
<p>当前我们的脚本组织方式，一般是每个aspx都会通过script标签引入一些js核心类库，然后在aspx页面里面混杂一些当前页面所需的业务逻辑脚本。</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/walkingboy/WindowsLiveWriter/ScriptLoaderV2_90E9/image_4.png"><img style="border: 0px none ;" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/walkingboy/WindowsLiveWriter/ScriptLoaderV2_90E9/image_thumb_1.png" border="0" height="288" width="644" /></a> </p>
</blockquote> <blockquote>
<p>这样子的写法导致js和我们的aspx进行了太紧密的结合，同时也不利于整个项目的维护。针对此，ScriptLoader提供了一个HttpModule来结合进行js的引入。当读入WebForm1.aspx的时候会自动帮你Load同目录下的WebForm1.aspx.js文件，因为是经过ScriptLoader导入的，所以具备ScriptLoader的特点，比如缓存，只要你的webForm1.aspx.js最后修改日期没有变，就可以一直利用客户端的缓存。</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/walkingboy/WindowsLiveWriter/ScriptLoaderV2_90E9/image_28.png"><img style="border: 0px none ;" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/walkingboy/WindowsLiveWriter/ScriptLoaderV2_90E9/image_thumb.png" border="0" height="174" width="771" /></a> </p>
</blockquote> <blockquote>
<p>不过你可能会想到这样一种情况：</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/walkingboy/WindowsLiveWriter/ScriptLoaderV2_90E9/image_6.png"><img style="border: 0px none ;" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/walkingboy/WindowsLiveWriter/ScriptLoaderV2_90E9/image_thumb_2.png" border="0" height="184" width="644" /></a> </p>
<p>我们经常使用&lt;%=this.TxtName.ClientID%&gt;这种方法来获取服务端控件在客户端的唯一id，那这个情况在外部引入的js是没办法使用的，所以我引入了ScriptLoaderV2的第二个特性。</p>
</blockquote>
<p><strong><span style="color: rgb(0, 16, 255);">多语言资源的支持途径:</span></strong></p>
<blockquote>
<p>通过ScriptLoader.SetVariable方法进行赋值。</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/walkingboy/WindowsLiveWriter/ScriptLoaderV2_90E9/image_8.png"><img style="border: 0px none ;" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/walkingboy/WindowsLiveWriter/ScriptLoaderV2_90E9/image_thumb_3.png" border="0" height="87" width="644" /></a> </p>
</blockquote> <blockquote>
<p>相关的方法还有</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/walkingboy/WindowsLiveWriter/ScriptLoaderV2_90E9/image_10.png"><img style="border: 0px none ;" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/walkingboy/WindowsLiveWriter/ScriptLoaderV2_90E9/image_thumb_4.png" border="0" height="111" width="644" /></a> </p>
<p>如果你用到了这个特性，那会产生侵入性了，如果你不想产生侵入性，你也可以使用Asp.Net原始的方法：</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/walkingboy/WindowsLiveWriter/ScriptLoaderV2_90E9/image_12.png"><img style="border: 0px none ;" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/walkingboy/WindowsLiveWriter/ScriptLoaderV2_90E9/image_thumb_5.png" border="0" height="110" width="644" /></a> </p>
</blockquote> <blockquote>
<p>那这个特性跟多语言又有什么关系呢？</p>
<p>因为这其中有个方法是读取xml配置文件直接设置变量的，xml如下：</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/walkingboy/WindowsLiveWriter/ScriptLoaderV2_90E9/image_14.png"><img style="border: 0px none ;" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/walkingboy/WindowsLiveWriter/ScriptLoaderV2_90E9/image_thumb_6.png" border="0" height="213" width="644" /></a> </p>
</blockquote> <blockquote>
<p>读入的代码：</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/walkingboy/WindowsLiveWriter/ScriptLoaderV2_90E9/image_16.png"><img style="border: 0px none ;" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/walkingboy/WindowsLiveWriter/ScriptLoaderV2_90E9/image_thumb_7.png" border="0" height="59" width="644" /></a> </p>
</blockquote> <blockquote>
<p>因此，如果你想对这些变量做根据不同的语言做不同的赋值的话，就可以多写几个config，比如myVars-en-US.config,myVars-zh-cn.config,然后根据不同语言版本载入不同的变量，而js中需要做多语言的都用变量代替字符常量。</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/walkingboy/WindowsLiveWriter/ScriptLoaderV2_90E9/image_18.png"><img style="border: 0px none ;" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/walkingboy/WindowsLiveWriter/ScriptLoaderV2_90E9/image_thumb_8.png" border="0" height="87" width="644" /></a>&nbsp;</p>
<p>当然这还有更好的集成方式，就是把页面组织结构改成如下形式</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/walkingboy/WindowsLiveWriter/ScriptLoaderV2_90E9/image_20.png"><img style="border: 0px none ;" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/walkingboy/WindowsLiveWriter/ScriptLoaderV2_90E9/image_thumb_9.png" border="0" height="174" width="644" /></a> </p>
</blockquote> <blockquote>
<p>然后就像第一个特性一样，自动根据语言版本载入不同js或者config，目前未增加这个特性，因为还没有办法考虑到有些什么特殊情况，所以还不准备增加此特性，不过这个的修改也是很快的，如果你有需要可以自行下载代码，进行修改，如果能把你的应用情况反馈给我，那自然更好了。时机成熟，我会考虑直接集成进ScriptLoader的代码。</p>
<p>变量的问题解决了，但是每个业务逻辑的js不可能离开一些核心的js类库，比如例子中的<a href="http://www.cnblogs.com/images/cnblogs_com/walkingboy/WindowsLiveWriter/ScriptLoaderV2_90E9/image_22.png"><img style="border: 0px none ;" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/walkingboy/WindowsLiveWriter/ScriptLoaderV2_90E9/image_thumb_10.png" border="0" height="46" width="644" /></a> </p>
<p>我需要在当前页面引入jquery类库，那怎么办？为了解决这个问题，ScriptLoader增加第三个特性。</p>
</blockquote>
<p><strong><span style="color: rgb(0, 16, 255);">Syntactic Sugar:</span></strong></p>
<blockquote>
<p>所谓Syntactic Sugar，就是一种取巧的做法，有点像Vs2008中的自动属性</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/walkingboy/WindowsLiveWriter/ScriptLoaderV2_90E9/image_24.png"><img style="border: 0px none ;" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/walkingboy/WindowsLiveWriter/ScriptLoaderV2_90E9/image_thumb_11.png" border="0" height="154" width="644" /></a> </p>
</blockquote> <blockquote>
<p>其实这不是标准的语言库支持的特性，是Vs2008这个IDE为我们提供的一种便利通道。在ScriptLoader中为了解决引入脚本的问题也加入类似的特性：</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/walkingboy/WindowsLiveWriter/ScriptLoaderV2_90E9/image_26.png"><img style="border: 0px none ;" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/walkingboy/WindowsLiveWriter/ScriptLoaderV2_90E9/image_thumb_12.png" border="0" height="388" width="644" /></a> </p>
<p>可以看到在WebForm2.aspx.js中的头部，使用了一个叫using的方法，引入了3个在我们lib.config中配置的js module。</p>
<p>这个Syntactic Sugar只能用在WebForm2.aspx.js这中类型的js中，不是所有js类库都可以使用，ScriptLoader会在为aspx页面注入ScriptLoader的时候，进行分析，然后自动帮你Load这些模块。核心的类库还是必须通过lib.config/user.config进行配置的，这样子你才可以使用using(moduleName)来引入这些脚本。</p>
</blockquote>
<p><strong><span style="color: rgb(0, 16, 255);">后记：</span></strong></p>
<blockquote>
<p>我是标题党，呵呵，不要批我的标题。</p>
<p>如果你使用ScriptLoader的这些特性，确实可以改善你的很多js文件组织体验。现在大部分js类库更加关心功能的封装，但是对于js文件的组织管理甚少关注，ScriptLoader就是为了填补这个空白而出现的。</p>
<p>后续的版本会增加更多让你心动的特性，比如ClientCacheManager :)</p>
<p>Examples包含在src发布包中，你也可以通过svn获取ScriptLoader最近的版本</p>
<p><a href="http://www.sourceforge.net/projects/scriptloader" target="_blank">Http://www.sourceforge.net/projects/scriptloader</a></p>
</blockquote>
<img src="http://www.cnblogs.com/walkingboy/aggbug/1219216.html?type=1" width="1" height="1" alt=""/><p>评论: 20　<a href="http://www.cnblogs.com/walkingboy/archive/2008/06/13/ScriptLoaderV2.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/walkingboy/archive/2008/06/13/ScriptLoaderV2.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56814/" target="_blank">Sun前CEO欲写自传 称经济危机是Sun被购主因</a><span style="color:gray">(2010-02-10 11:25)</span><br/>· <a href="http://news.cnblogs.com/n/56812/" target="_blank">Google社会化产品Buzz发布会实录</a><span style="color:gray">(2010-02-10 11:15)</span><br/>· <a href="http://news.cnblogs.com/n/56813/" target="_blank">福布斯：苹果生态产业链上的十大企业</a><span style="color:gray">(2010-02-10 11:14)</span><br/>· <a href="http://news.cnblogs.com/n/56811/" target="_blank">纽约时报：Google凭借Buzz进军社交网络</a><span style="color:gray">(2010-02-10 10:59)</span><br/>· <a href="http://news.cnblogs.com/n/56810/" target="_blank">百度视频公司龚宇：图文时代互联网竞争已定</a><span style="color:gray">(2010-02-10 10:56)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56812/" target="_blank">Google社会化产品Buzz发布会实录</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>[OpenSource]ScriptLoader: 轻松管理你的js 类库</title><link>http://www.cnblogs.com/walkingboy/archive/2008/06/09/ScriptLoader.html</link><dc:creator>浪子</dc:creator><author>浪子</author><pubDate>Sun, 08 Jun 2008 17:15:00 GMT</pubDate><guid>http://www.cnblogs.com/walkingboy/archive/2008/06/09/ScriptLoader.html</guid><description><![CDATA[<p>阅读: 3054 评论: 35 作者: <a href="http://www.cnblogs.com/walkingboy/" target="_blank">浪子</a> 发表于 2008-06-09 01:15 <a href="http://www.cnblogs.com/walkingboy/archive/2008/06/09/ScriptLoader.html" target="_blank">原文链接</a></p><p><span style="font-size: 12pt; color: rgb(15, 36, 62);"><strong>摘要: </strong></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://scriptloader.sourceforge.net/" target="_blank">ScriptLoader</a>是<a href="http://www.cnblogs.com/walkingboy/archive/2007/11/30/opensource_smartscript.html" target="_blank"><span style="font-family: Verdana;">SmartScript</span></a>的后续版本. <a href="http://scriptloader.sourceforge.net/" target="_blank">ScriptLoader</a>可以让你通过一个单一的配置文件来管理你的所有js类库,包括自主开发与第三方类库,无需加入自己的任何代码.新版本的<a href="http://scriptloader.sourceforge.net/" target="_blank">ScriptLoader</a>拥有更多的特性和更好的性能.支持自动载入依赖脚本,自动更新版本,更新客户端缓存,同时支持客户端和服务端编程,使得js类库的载入更加透明化,更加易读.相信<a href="http://scriptloader.sourceforge.net/" target="_blank">ScriptLoader</a>一定会成为你开发Asp.net webstie的良好助手. </p>
<p><span style="font-size: 12pt; color: rgb(15, 36, 62);"><strong>简介: </strong></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;ScriptLoader是一个无侵入性的脚本管理方案,使用它来管理你的众多脚本类库,不会产生大量的侵入性代码.同时,比起SmartScript增加了,"脚本依赖载入","版本自动更新","脚本灵活导入"等新特性,一定会让你耳目一新^_^. </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;ScriptLoader使用LGPL开源协议,你可以访问<a href="http://scriptloader.sourceforge.net/" target="_blank"><span style="color: rgb(0, 112, 192);"><strong>ScriptLoader@sourceforge.net</strong></span></a>获得更多的信息. </p>
<p>&nbsp;</p>
<p><span style="font-size: 12pt; color: rgb(15, 36, 62);"><strong>Advance Features: </strong></span></p>
<p>支持多种脚本导入方式(<a href="http://scriptloader.sourceforge.net/doc/configure_module.html" target="_blank"><span style="font-size: 10pt; color: rgb(51, 102, 204); font-family: Tahoma;">How to configure a javascript file as a module?</span></a>): </p>
<ol style="margin-left: 54pt;">
    <li>相对路径导入<br />
    <img alt="" src="http://www.cnblogs.com/images/cnblogs_com/walkingboy/060808_1624_OpenSourceS1.png" /><br />
    </li>
    <li>绝对路径导入：<br />
    <img alt="" src="http://www.cnblogs.com/images/cnblogs_com/walkingboy/060808_1624_OpenSourceS2.png" /><br />
    </li>
    <li>远程路径导入:<br />
    <img alt="" src="http://www.cnblogs.com/images/cnblogs_com/walkingboy/060808_1624_OpenSourceS3.png" /><br />
    使用此方式导入的文件,会在每次初始化ScriptLoader的时候,重新更新远程的文件到本地.<br />
    </li>
    <li>
    <div>虚拟文件聚合导入:<br />
    <img alt="" src="http://www.cnblogs.com/images/cnblogs_com/walkingboy/060808_1624_OpenSourceS4.png" /> </div>
    <p>使用此方式的好处是,可以整合多个文件到一个Module上,这样子引入脚本的时候就可以使用"javascript" 来代替"core"和"BrushJScript"了. </p>
    <p>&nbsp;</p>
    </li>
</ol>
<p><span style="font-size: 12pt; color: rgb(15, 36, 62);"><strong>Configuration files</strong></span>(<a href="http://scriptloader.sourceforge.net/doc/configure_dependences.html" target="_blank"><span style="font-size: 10pt; color: rgb(51, 102, 204); font-family: Tahoma;">How to configure a dependence of a module?</span></a>): </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;ScriptLoader的配置信息放在&lt;root&gt;/Scripts/Config/底下,包含两个文件: </p>
<p style="margin-left: 54pt;">1、Lib.config:主要用于配置核心的js类库，如果你的开发团队同时使用很多相同的类库的话，这个配置文件将可以减少你们的重复工作和维护成本。（这个文件是必须的） </p>
<p style="margin-left: 54pt;">2、User.config:主要用于配置各自项目的独立js文件，主要跟业务相关。（这个文件是可选的） </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;配置文件的格式如下： </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;<img alt="" src="http://www.cnblogs.com/images/cnblogs_com/walkingboy/060808_1624_OpenSourceS5.png" /> </p>
<p><span style="font-size: 12pt; color: rgb(15, 36, 62);"><strong>Step by step</strong></span><span style="font-size: 8pt; font-family: Verdana;"> (</span><span style="color: rgb(51, 102, 204);"><a href="http://scriptloader.sourceforge.net/doc/index.html"><span style="color: rgb(51, 102, 204);">QuickStart</span></a></span><span style="font-size: 8pt; font-family: Tahoma;">):</span> </p>
<ol style="margin-left: 54pt;">
    <li>注册一个HttpHanlder,用来Handle脚本的载入:<br />
    <img alt="" src="http://www.cnblogs.com/images/cnblogs_com/walkingboy/060808_1624_OpenSourceS6.png" /><br />
    请放心使用此HttpHandler,已经对普通的js引入进行了处理,不会影响原来的js引入方式:<br />
    </li>
    <li>
    <div>配置JS相关类库 </div>
    <p><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/walkingboy/060808_1624_OpenSourceS7.png" /><br />
    如果你需要配置脚本的依赖关系,也需要在此时进行配置,比如: </p>
    <p><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/walkingboy/060808_1624_OpenSourceS8.png" /><br />
    </p>
    </li>
    <li>注册一个ScriptLoader对象到Page上:<br />
    <img alt="" src="http://www.cnblogs.com/images/cnblogs_com/walkingboy/060808_1624_OpenSourceS9.png" /><br />
    推荐使用服务端的注册方法<br />
    </li>
    <li>
    <div>在程序中引入所需的js 模块:<br />
    <img alt="" src="http://www.cnblogs.com/images/cnblogs_com/walkingboy/060808_1624_OpenSourceS10.png" /> </div>
    <p><br />
    或者<br />
    <img alt="" src="http://www.cnblogs.com/images/cnblogs_com/walkingboy/060808_1624_OpenSourceS11.png" /> </p>
    </li>
</ol>
<p>所有文件的下载地址:包括binary,src,quickstart:<br />
<font face="Verdana"><a href="http://sourceforge.net/project/showfiles.php?group_id=228776" target="_blank"><font face="Verdana">http://sourceforge.net/project/showfiles.php?group_id=228776</font></a><br />
或者可以从svn下载最新版本:<br />
<font face="Verdana"><a href="https://scriptloader.svn.sourceforge.net/svnroot/scriptloader" target="_blank"><font face="Verdana">https://scriptloader.svn.sourceforge.net/svnroot/scriptloader</font></a></font></font></p>
<img src="http://www.cnblogs.com/walkingboy/aggbug/1216099.html?type=1" width="1" height="1" alt=""/><p>评论: 35　<a href="http://www.cnblogs.com/walkingboy/archive/2008/06/09/ScriptLoader.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/walkingboy/archive/2008/06/09/ScriptLoader.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56814/" target="_blank">Sun前CEO欲写自传 称经济危机是Sun被购主因</a><span style="color:gray">(2010-02-10 11:25)</span><br/>· <a href="http://news.cnblogs.com/n/56812/" target="_blank">Google社会化产品Buzz发布会实录</a><span style="color:gray">(2010-02-10 11:15)</span><br/>· <a href="http://news.cnblogs.com/n/56813/" target="_blank">福布斯：苹果生态产业链上的十大企业</a><span style="color:gray">(2010-02-10 11:14)</span><br/>· <a href="http://news.cnblogs.com/n/56811/" target="_blank">纽约时报：Google凭借Buzz进军社交网络</a><span style="color:gray">(2010-02-10 10:59)</span><br/>· <a href="http://news.cnblogs.com/n/56810/" target="_blank">百度视频公司龚宇：图文时代互联网竞争已定</a><span style="color:gray">(2010-02-10 10:56)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56812/" target="_blank">Google社会化产品Buzz发布会实录</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>关于Windows Mobile 6 Professional Emulator中的一个串口设置小问题.</title><link>http://www.cnblogs.com/walkingboy/archive/2008/05/13/Windows_Mobile6_Professional_Emulator_Serial_Port_Configuration.html</link><dc:creator>浪子</dc:creator><author>浪子</author><pubDate>Tue, 13 May 2008 14:22:00 GMT</pubDate><guid>http://www.cnblogs.com/walkingboy/archive/2008/05/13/Windows_Mobile6_Professional_Emulator_Serial_Port_Configuration.html</guid><description><![CDATA[<p>阅读: 746 评论: 3 作者: <a href="http://www.cnblogs.com/walkingboy/" target="_blank">浪子</a> 发表于 2008-05-13 22:22 <a href="http://www.cnblogs.com/walkingboy/archive/2008/05/13/Windows_Mobile6_Professional_Emulator_Serial_Port_Configuration.html" target="_blank">原文链接</a></p>在<a href="http://download.microsoft.com/download/f/2/3/f232f773-7edc-4300-be07-d3b76a5b3a91/Windows%20Mobile%206%20Professional%20SDK%20Refresh.msi">Windows Mobile 6 Professional SDK Refresh.msi</a> 中附带了一个Cellular Emulator（蜂窝仿真器）。Cellular Emulator 让你能够在 Device Emulator 中，测试你的应用程序在各种蜂窝通信的情况下的行为。<br />
<br />
不过Cellular Emulator是通过模拟串口的形式和Windows Mobile 6 professional Emulator进行通讯的,所以我们必须在Windows Mobile 6 Professional Emulator中设置以之对应的串口.<br />
<br />
首先第一步,先搞清楚Cellular Emulator在你的电脑上所使用的串口是什么?<br />
<img height="410" alt="" src="http://www.cnblogs.com/images/cnblogs_com/walkingboy/Cellular_Emulator.PNG" width="445" border="0" /><br />
<br />
然后链接到我们使用的Device Emulator,进入File-&gt;Configure,在<span style="font-size: 10.5pt; color: #000000; line-height: normal"><strong>Peripheral</strong></span>页中我们可以看到Serial Port 0~3.<br />
但是我们在Serial Port的下拉列表中找不到与上图Cellular Emulator相同的串口(COM3).<br />
<img height="460" alt="" src="http://www.cnblogs.com/images/cnblogs_com/walkingboy/Device_Emulator.PNG" width="533" border="0" /><br />
<br />
我被这个问题晕了一个中午,以为是公司的电脑的问题,晚上回家发现家里也一样.仔细看了下,才发现这个框框是<strong style="color: red">可以输入</strong>的,巨汗,这个设计真的有点不太友好啊.同是MS的东东,Microsoft ActiveSync就友好多了.<br />
<img height="402" alt="" src="http://www.cnblogs.com/images/cnblogs_com/walkingboy/ActiveSync.PNG" width="511" border="0" /><br />
<br />
<br />
不知道是不是有人和我一样,碰到这个问题^_^.输入和Cellular Emulator一样的串口(COM3),然后软启动下Device Emulator,就可以模拟各种网络了.<br />
<img height="481" alt="" src="http://www.cnblogs.com/images/cnblogs_com/walkingboy/Phone_Emulator.PNG" width="775" border="0" /><br />
<br />
<br />
<img src="http://www.cnblogs.com/walkingboy/aggbug/1195885.html?type=1" width="1" height="1" alt=""/><p>评论: 3　<a href="http://www.cnblogs.com/walkingboy/archive/2008/05/13/Windows_Mobile6_Professional_Emulator_Serial_Port_Configuration.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/walkingboy/archive/2008/05/13/Windows_Mobile6_Professional_Emulator_Serial_Port_Configuration.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56814/" target="_blank">Sun前CEO欲写自传 称经济危机是Sun被购主因</a><span style="color:gray">(2010-02-10 11:25)</span><br/>· <a href="http://news.cnblogs.com/n/56812/" target="_blank">Google社会化产品Buzz发布会实录</a><span style="color:gray">(2010-02-10 11:15)</span><br/>· <a href="http://news.cnblogs.com/n/56813/" target="_blank">福布斯：苹果生态产业链上的十大企业</a><span style="color:gray">(2010-02-10 11:14)</span><br/>· <a href="http://news.cnblogs.com/n/56811/" target="_blank">纽约时报：Google凭借Buzz进军社交网络</a><span style="color:gray">(2010-02-10 10:59)</span><br/>· <a href="http://news.cnblogs.com/n/56810/" target="_blank">百度视频公司龚宇：图文时代互联网竞争已定</a><span style="color:gray">(2010-02-10 10:56)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56812/" target="_blank">Google社会化产品Buzz发布会实录</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>文件被数字签名策略拒绝(File was rejected by digital signature policy) </title><link>http://www.cnblogs.com/walkingboy/archive/2008/04/27/WM6_SDK_Install_Digital_Signature.html</link><dc:creator>浪子</dc:creator><author>浪子</author><pubDate>Sun, 27 Apr 2008 15:17:00 GMT</pubDate><guid>http://www.cnblogs.com/walkingboy/archive/2008/04/27/WM6_SDK_Install_Digital_Signature.html</guid><description><![CDATA[<p>阅读: 2069 评论: 12 作者: <a href="http://www.cnblogs.com/walkingboy/" target="_blank">浪子</a> 发表于 2008-04-27 23:17 <a href="http://www.cnblogs.com/walkingboy/archive/2008/04/27/WM6_SDK_Install_Digital_Signature.html" target="_blank">原文链接</a></p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 今天在安装<a href="http://download.microsoft.com/download/f/2/3/f232f773-7edc-4300-be07-d3b76a5b3a91/Windows%20Mobile%206%20Professional%20SDK%20Refresh.msi">Windows Mobile 6 Professional SDK Refresh.msi</a> 的时候,碰到一个错误"文件被数字签名策略拒绝(File was rejected by digital signature policy) ",可能在安装 Visual Studio 2005 SP1 的时候,也有人碰到过这个错误.<br />
&nbsp;&nbsp;&nbsp;<img height="394" alt="" src="http://www.cnblogs.com/images/cnblogs_com/walkingboy/wm6_sdk_digital_signature.JPG" width="498" border="0" /><br />
&nbsp;&nbsp;&nbsp;&nbsp; 这个错误产生的原因是:"当运行安装程序时，Windows Installer 会验证程序包的数字签名以确保程序包没有被篡改。这时整个程序包被加载到内存中，计算机必须拥有程序包大小所需的足够连续内存。如果计算机没有足够的连续内存，则会出现错误。由于出现错误，Windows Installer 将无法验证是否对该程序包正确地进行了签名。"<br />
<br />
&nbsp;&nbsp;&nbsp; 所以这个问题呢应该只会出现在内存比较少的电脑,比如我的只有1G内存,所以承受不起这个454.7 MB的SDK,就出现了这个恼人的问题.<br />
<br />
&nbsp;&nbsp; 解决方法:<br />
<br />
&nbsp; 1.修改 HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\Safer\CodeIdentifiers 注册表项下面的 PolicyScope 的注册表值，将值从0改为1 (<font color="#008000">附件:SetPolicyScope.reg</font>)<br />
<br />
&nbsp; 2.在cmd中,运行 <span class="userInput">net stop msiserver,关闭Window Installer服务. (<font color="#008000">附件:stop_msiserver.bat</font>)<br />
</span><br />
&nbsp; 3. 运行安装程序<br />
<br />
&nbsp; 4.修复PolicyScope.(<font color="#008000">附件:ResetPolicyScope.reg</font>)<br />
<br />
<br />
&nbsp; 如果你嫌麻烦,可以下载我写好的reg和bat文件<a href="http://www.cnblogs.com/Files/walkingboy/wm6_sdk_reg.zip"><font color="#002c99">wm6_sdk_reg.zip</font></a><br />
<br />
&nbsp; MS Support:&nbsp; <a href="http://support.microsoft.com/kb/925336">http://support.microsoft.com/kb/925336</a> 
<img src="http://www.cnblogs.com/walkingboy/aggbug/1173676.html?type=1" width="1" height="1" alt=""/><p>评论: 12　<a href="http://www.cnblogs.com/walkingboy/archive/2008/04/27/WM6_SDK_Install_Digital_Signature.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/walkingboy/archive/2008/04/27/WM6_SDK_Install_Digital_Signature.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56814/" target="_blank">Sun前CEO欲写自传 称经济危机是Sun被购主因</a><span style="color:gray">(2010-02-10 11:25)</span><br/>· <a href="http://news.cnblogs.com/n/56812/" target="_blank">Google社会化产品Buzz发布会实录</a><span style="color:gray">(2010-02-10 11:15)</span><br/>· <a href="http://news.cnblogs.com/n/56813/" target="_blank">福布斯：苹果生态产业链上的十大企业</a><span style="color:gray">(2010-02-10 11:14)</span><br/>· <a href="http://news.cnblogs.com/n/56811/" target="_blank">纽约时报：Google凭借Buzz进军社交网络</a><span style="color:gray">(2010-02-10 10:59)</span><br/>· <a href="http://news.cnblogs.com/n/56810/" target="_blank">百度视频公司龚宇：图文时代互联网竞争已定</a><span style="color:gray">(2010-02-10 10:56)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56812/" target="_blank">Google社会化产品Buzz发布会实录</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item></channel></rss>