<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_yicone's blog - 留下脚印</title><subtitle type="text">The future is worth fighting for.</subtitle><id>http://feed.cnblogs.com/blog/u/12032/rss</id><updated>2011-08-06T12:17:43Z</updated><author><name>yicone</name><uri>http://www.cnblogs.com/yicone/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yicone/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/12032/rss"/><entry><id>http://www.cnblogs.com/yicone/archive/2011/07/19/2110870.html</id><title type="text">记录一次重构</title><summary type="text">重构前：Cache.Add(DXCacheKey.A, Register(DXCacheKey.A, DXCacheKeyType.A, dal.GetItemA, dal.GetItemAById));Cache.Add(DXCacheKey.B, Register(DXCacheKey.B, DXCacheKeyType.B, dal.GetItemB, dal.GetItemBById));,,,此次重构的目标是将规则的建立和使用进行分离（IDXCacheItemWrapper）, 副产品是将某一形式的规则进行了封装(DXCacheItemWrapper)。分离的好处：一是，增强了代码的</summary><published>2011-07-19T09:37:00Z</published><updated>2011-07-19T09:37:00Z</updated><author><name>yicone</name><uri>http://www.cnblogs.com/yicone/</uri></author><link rel="alternate" href="http://www.cnblogs.com/yicone/archive/2011/07/19/2110870.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yicone/archive/2011/07/19/2110870.html"/><content type="html">&lt;p&gt;重构前：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #000000;"&gt;Cache.Add(DXCacheKey.A, Register(DXCacheKey.A, DXCacheKeyType.A, dal.GetItemA, dal.GetItemAById));&lt;br /&gt;Cache.Add(DXCacheKey.B, Register(DXCacheKey.B, DXCacheKeyType.B, dal.GetItemB, dal.GetItemBById));&lt;br /&gt;,,,&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;此次重构的目标是将规则的建立和使用进行分离（IDXCacheItemWrapper）, 副产品是将某一形式的规则进行了封装(DXCacheItemWrapper)。&lt;/p&gt;&#xD;
&lt;p&gt;分离的好处：&lt;/p&gt;&#xD;
&lt;p&gt;一是，增强了代码的的可读性。因为这是个较为自然的过程，先创建规则，然后使用它。&lt;/p&gt;&#xD;
&lt;p&gt;二是，其他形式的规则，只要符合IDXCacheItemWrapper，也可以加入到计算任务中来。&lt;/p&gt;&#xD;
&lt;p&gt;三是，规则建立好后，不必立即使用，可以延迟计算。在此期间，可以对规则集进行筛选，增补等操作。&lt;/p&gt;&#xD;
&lt;div style="width: 95%; height: 932px;" style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; Class1&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; Class1()&lt;br /&gt;    {&lt;br /&gt;        DAL dal &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; DAL();&lt;br /&gt;        List&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;IDXCacheItemWrapper&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; list &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; List&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;IDXCacheItemWrapper&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; DXCacheItemWrapper&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;ItemA, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(DXCacheKey.A, DXCacheKeyType.A, dal.GetItemA, dal.GetItemAById),&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; DXCacheItemWrapper&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;ItemB, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(DXCacheKey.B, DXCacheKeyType.B, dal.GetItemB, dal.GetItemBById),&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; DXCacheItemWrapper&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;ItemC, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(DXCacheKey.C, DXCacheKeyType.C, dal.GetItemC, dal.GetItemCById),&lt;br /&gt;        };&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt;&lt;span style="color: #000000;"&gt; (IDXCacheItemWrapper w &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; list)&lt;br /&gt;        {&lt;br /&gt;            var value &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; w.GetValue();&lt;br /&gt;            Cache.Add(w.Key.ToString(), value);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;interface&lt;/span&gt;&lt;span style="color: #000000;"&gt; IDXCacheItemWrapper&lt;br /&gt;{&lt;br /&gt;    DXCacheKey Key { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; GetValue();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; DXCacheItemWrapper&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T1, T2&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; : IDXCacheItemWrapper&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; DXCacheItemWrapper(DXCacheKey key, DXCacheKeyType keyType, Func&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T1&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; getData1, Func&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T2, T1&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; getData2)&lt;br /&gt;    {&lt;br /&gt;        Key &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; key;&lt;br /&gt;        KeyType &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; keyType;&lt;br /&gt;        GetData1 &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; getData1;&lt;br /&gt;        GetData2 &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; getData2;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; GetValue()&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; GetValue&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T1, T2&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(Key, KeyType, GetData1, GetData2);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; T1 GetValue&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T1, T2&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(DXCacheKey key, DXCacheKeyType keyType, Func&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T1&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; f1, Func&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T2, T1&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; f2)&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;default&lt;/span&gt;&lt;span style="color: #000000;"&gt;(T1);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; DXCacheKey Key { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; DXCacheKeyType KeyType { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; Func&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T1&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; GetData1 { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; Func&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T2, T1&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; GetData2 { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br /&gt;}&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/yicone/aggbug/2110870.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/yicone/archive/2011/07/19/2110870.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/yicone/archive/2010/12/24/1916090.html</id><title type="text">IE8下处理iframe自适应高度的小问题</title><summary type="text">老生常谈的问题, 网络上铺天盖地的处理方法, 还有抄来转去的&amp;quot;博文&amp;quot;. 在此主要说明今日遇到的特定于IE8的一个特定问题. function autoSetFrameHeight(name) { try { var iframe; if (!name) return; iframe = document.getElementById(name); if (iframe.contentDocument) $(&amp;quot;#&amp;quot; + name).height(iframe.contentDocument.height + &amp;quot;px&amp;quot;); else $(</summary><published>2010-12-24T08:03:00Z</published><updated>2010-12-24T08:03:00Z</updated><author><name>yicone</name><uri>http://www.cnblogs.com/yicone/</uri></author><link rel="alternate" href="http://www.cnblogs.com/yicone/archive/2010/12/24/1916090.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yicone/archive/2010/12/24/1916090.html"/><content type="html">&lt;p&gt;&lt;span style="color: #0f243e; font-size: 10pt;"&gt;&lt;span style="font-family: 微软雅黑;"&gt;老生常谈的问题&lt;/span&gt;,&lt;span style="font-family: 微软雅黑;"&gt; 网络上铺天盖地的处理方法, 还有抄来转去的"博文". 在此主要说明今日遇到的特定于IE8的一个特定问题.&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p style="margin-left: 27pt;"&gt;&lt;span style="color: #0f243e; font-family: 微软雅黑; font-size: 10pt;"&gt;function autoSetFrameHeight(name) { &lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0f243e; font-family: 微软雅黑; font-size: 10pt;"&gt;try { &lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0f243e; font-family: 微软雅黑; font-size: 10pt;"&gt;var iframe; &lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0f243e; font-size: 10pt;"&gt;&lt;span style="font-family: 微软雅黑;"&gt;if (!name) &lt;/span&gt;return&lt;span style="font-family: 微软雅黑;"&gt;;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0f243e; font-family: 微软雅黑; font-size: 10pt;"&gt;iframe = document.getElementById(name); &lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0f243e; font-family: 微软雅黑; font-size: 10pt;"&gt;if (iframe.contentDocument) &lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span style="color: #0f243e;"&gt;&lt;span style="font-family: 微软雅黑;"&gt;$("#" + name).height(&lt;span style="color: red;"&gt;iframe.contentDocument.&lt;/span&gt;&lt;/span&gt;height&lt;span style="font-family: 微软雅黑;"&gt; + "px");&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0f243e; font-family: 微软雅黑; font-size: 10pt;"&gt;else &lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0f243e; font-family: 微软雅黑; font-size: 10pt;"&gt;$("#" + name).height(document.frames[name].document.body.scrollHeight + "px"); &lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0f243e; font-family: 微软雅黑; font-size: 10pt;"&gt;} &lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0f243e; font-family: 微软雅黑; font-size: 10pt;"&gt;catch (e) { &lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0f243e; font-family: 微软雅黑; font-size: 10pt;"&gt;// alert(e.message); &lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0f243e; font-family: 微软雅黑; font-size: 10pt;"&gt;} &lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0f243e; font-family: 微软雅黑; font-size: 10pt;"&gt;} &lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span style="color: #0f243e;"&gt;&lt;span style="font-family: 微软雅黑;"&gt;今天有用户反应&lt;/span&gt;IE8&lt;span style="font-family: 微软雅黑;"&gt;下某个弹窗&lt;/span&gt;(iframe&lt;span style="font-family: 微软雅黑;"&gt;内嵌个小页面&lt;/span&gt;)&lt;span style="font-family: 微软雅黑;"&gt;显示不完全&lt;/span&gt;,&lt;span style="font-family: 微软雅黑;"&gt; 后经测试, &lt;span style="color: red;"&gt;iframe.contentDocument.height&lt;/span&gt;在&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 微软雅黑;"&gt;IE8下无效, 在IE6-7, Chrome, Firefox3~4下&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span style="font-family: 微软雅黑;"&gt;改为&lt;span style="color: red;"&gt;iframe.contentDocument.body.offsetHeight&lt;/span&gt;后, 在IE6&lt;/span&gt;-&lt;span style="font-family: 微软雅黑;"&gt;8, Chrome, Firefox3~4下测试通过.&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span style="font-family: 微软雅黑;"&gt;本文的示例代码运行在真实项目中&lt;/span&gt;, &lt;span style="font-family: 微软雅黑;"&gt;但由于&lt;/span&gt;iframe&lt;span style="font-family: 微软雅黑;"&gt;目标页面承载的内容较为简单&lt;/span&gt;, &lt;span style="font-family: 微软雅黑;"&gt;因此并未测试&lt;/span&gt;iframe&lt;span style="font-family: 微软雅黑;"&gt;目标页面中包含绝对定位层展开&lt;/span&gt;/&lt;span style="font-family: 微软雅黑;"&gt;折叠&lt;/span&gt;,&lt;span style="font-family: 微软雅黑;"&gt; 以及包含float层的情况, &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span style="font-family: 微软雅黑;"&gt;也未处理某些文章提及的&lt;/span&gt;"&lt;span style="font-family: 微软雅黑;"&gt;非&lt;/span&gt;IE&lt;span style="font-family: 微软雅黑;"&gt;浏览器会有长高了缩不回去&lt;/span&gt;"&lt;span style="font-family: 微软雅黑;"&gt;的情形&lt;/span&gt;.&lt;span style="font-family: 微软雅黑;"&gt; 请读者注意.&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span style="font-family: 微软雅黑;"&gt;參考資料&lt;/span&gt;:&lt;span style="font-family: 微软雅黑;"&gt; (請讀者自行驗證原文內容, 辯證接受)&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;ol&gt;&#xD;
&lt;li&gt;&lt;a href="http://www.cnblogs.com/yuhe7919/archive/2009/11/04/iframe.html"&gt;&lt;span style="font-family: 微软雅黑; font-size: 10pt;"&gt;http://www.cnblogs.com/yuhe7919/archive/2009/11/04/iframe.html&lt;/span&gt;&lt;/a&gt;&lt;span style="color: #0f243e; font-family: 微软雅黑; font-size: 10pt;"&gt; &lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&#xD;
&lt;div&gt;&lt;a href="http://blog.pchome.net/article/194139.html"&gt;&lt;span style="font-family: Arial; font-size: 10pt;"&gt;http://blog.pchome.net/article/194139.html&lt;/span&gt;&lt;/a&gt;&lt;span style="color: #0f243e; font-family: 微软雅黑; font-size: 10pt;"&gt; &lt;/span&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0f243e; font-size: 10pt;"&gt;&lt;span style="font-family: 微软雅黑;"&gt;此文中提及的代碼示例&lt;/span&gt;,&lt;span style="font-family: 微软雅黑;"&gt; 建議不要再採用了, 如果第一句取高度的代碼由於瀏覽器兼容性問題產生異常, 則此段代碼完全失效. 另外, 採用兩個高度比較的作法也沒有意義, 有些繞道並且繞遠了的感覺.&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0f243e; font-size: 10pt;"&gt;try&lt;span style="font-family: 微软雅黑;"&gt; {&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #666666; font-size: 10pt;"&gt;&lt;span style="font-family: Times New Roman;"&gt;var bHeight = iframe.contentWindow.document.body.scrollHeight;&lt;/span&gt;&lt;span style="color: #0f243e;"&gt;&lt;span style="font-family: 微软雅黑;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #666666; font-family: Times New Roman;"&gt;var dHeight = iframe.contentWindow.document.documentElement.scrollHeight;&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #666666; font-size: 10pt;"&gt;} catch(ex) { } &lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;/ol&gt;&lt;img src="http://www.cnblogs.com/yicone/aggbug/1916090.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/yicone/archive/2010/12/24/1916090.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/yicone/archive/2010/12/23/1915136.html</id><title type="text">Microsoft ASP.NET 2.0 AJAX 相关信息备忘</title><summary type="text">今天整理一个Visual Studio 2005的老项目, 其中用到了ASP.NET 2.0 AJAX的系列组件, 虽说是过时的东西, 但以后还是有些老项目要维护的. 出于备忘目的, 搜集整理相关信息如下 项目名称安装包程序集命名空间ASP.NET 2.0 AJAX ExtensionsASPAJAXExtSetup.msi System.Web.Extensions.dll v1.0.61025System.Web.ExtensionsASP.NET 2.0 AJAX FutureASPAJAXCTP.msiMicrosoft.Web.Preview.dllMicrosoft.Web.Pre</summary><published>2010-12-23T09:32:00Z</published><updated>2010-12-23T09:32:00Z</updated><author><name>yicone</name><uri>http://www.cnblogs.com/yicone/</uri></author><link rel="alternate" href="http://www.cnblogs.com/yicone/archive/2010/12/23/1915136.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yicone/archive/2010/12/23/1915136.html"/><content type="html">&lt;p&gt;&lt;span style="color: #0f243e; font-family: 微软雅黑; font-size: 10pt;"&gt;今天整理一个Visual Studio 2005的老项目, 其中用到了ASP.NET 2.0 AJAX的系列组件, 虽说是过时的东西, 但以后还是有些老项目要维护的. &lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0f243e; font-family: 微软雅黑; font-size: 10pt;"&gt;出于备忘目的, 搜集整理相关信息如下 &lt;/span&gt;&lt;/p&gt;&#xD;
&lt;div&gt;&#xD;
&lt;table style="border-collapse: collapse;" border="0"&gt;&lt;colgroup&gt;&#xD;
&lt;col style="width: 70px;" /&gt;&#xD;
&lt;col style="width: 145px;" /&gt;&#xD;
&lt;col style="width: 187px;" /&gt;&#xD;
&lt;col style="width: 168px;" /&gt;&#xD;
&lt;col style="width: 16px;" /&gt;&lt;/colgroup&gt;&#xD;
&lt;tbody valign="top"&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="border: solid #a3a3a3 1.0pt; padding: 5px;"&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0f243e; font-family: 微软雅黑; font-size: 10pt;"&gt;项目名称&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td style="border-top: solid #a3a3a3 1.0pt; border-left: none; border-bottom: solid #a3a3a3 1.0pt; border-right: solid #a3a3a3 1.0pt; padding: 5px;"&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0f243e; font-family: 微软雅黑; font-size: 10pt;"&gt;安装包&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td style="border-top: solid #a3a3a3 1.0pt; border-left: none; border-bottom: solid #a3a3a3 1.0pt; border-right: solid #a3a3a3 1.0pt; padding: 5px;"&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0f243e; font-family: 微软雅黑; font-size: 10pt;"&gt;程序集&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td style="border-top: solid #a3a3a3 1.0pt; border-left: none; border-bottom: solid #a3a3a3 1.0pt; border-right: solid #a3a3a3 1.0pt; padding: 5px;"&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0f243e; font-family: 微软雅黑; font-size: 10pt;"&gt;命名空间&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td style="border-top: solid #a3a3a3 1.0pt; border-left: none; border-bottom: solid #a3a3a3 1.0pt; border-right: solid #a3a3a3 1.0pt; padding: 5px;"&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0f243e; font-family: 微软雅黑; font-size: 10pt;"&gt;&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="border-top: none; border-left: solid #a3a3a3 1.0pt; border-bottom: solid #a3a3a3 1.0pt; border-right: solid #a3a3a3 1.0pt; padding: 5px;"&gt;&#xD;
&lt;p&gt;&lt;span style="color: #30332d; font-family: Segoe UI; font-size: 9pt;"&gt;ASP.NET 2.0 AJAX Extensions&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td style="border-top: none; border-left: none; border-bottom: solid #a3a3a3 1.0pt; border-right: solid #a3a3a3 1.0pt; padding: 5px;"&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=ca9d90fa-e8c9-42e3-aa19-08e2c027f5d6&amp;amp;displaylang=en"&gt;&lt;span style="font-family: Segoe UI; font-size: 9pt;"&gt;ASPAJAXExtSetup.msi&lt;/span&gt;&lt;/a&gt;&lt;span style="color: #30332d; font-family: Segoe UI; font-size: 9pt;"&gt; &lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td style="border-top: none; border-left: none; border-bottom: solid #a3a3a3 1.0pt; border-right: solid #a3a3a3 1.0pt; padding: 5px;"&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0f243e; font-size: 10pt;"&gt;&lt;span style="font-family: 微软雅黑;"&gt;System.Web.Extensions.dll&lt;/span&gt; v1.0.61025&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td style="border-top: none; border-left: none; border-bottom: solid #a3a3a3 1.0pt; border-right: solid #a3a3a3 1.0pt; padding: 5px;"&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0f243e; font-family: 微软雅黑; font-size: 10pt;"&gt;System.Web.Extensions&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td style="border-top: none; border-left: none; border-bottom: solid #a3a3a3 1.0pt; border-right: solid #a3a3a3 1.0pt; padding: 5px;"&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0f243e; font-family: 微软雅黑; font-size: 10pt;"&gt;&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="border-top: none; border-left: solid #a3a3a3 1.0pt; border-bottom: solid #a3a3a3 1.0pt; border-right: solid #a3a3a3 1.0pt; padding: 5px;"&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0f243e; font-size: 10pt;"&gt;ASP.NET 2.0 AJAX Future&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td style="border-top: none; border-left: none; border-bottom: solid #a3a3a3 1.0pt; border-right: solid #a3a3a3 1.0pt; padding: 5px;"&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyId=29B6B62B-A25A-498D-AA14-90B68CF2E392&amp;amp;displaylang=en"&gt;&lt;span style="font-family: Segoe UI; font-size: 9pt;"&gt;ASPAJAXCTP.msi&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td style="border-top: none; border-left: none; border-bottom: solid #a3a3a3 1.0pt; border-right: solid #a3a3a3 1.0pt; padding: 5px;"&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0f243e; font-family: 微软雅黑; font-size: 10pt;"&gt;Microsoft.Web.Preview.dll&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td style="border-top: none; border-left: none; border-bottom: solid #a3a3a3 1.0pt; border-right: solid #a3a3a3 1.0pt; padding: 5px;"&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0f243e; font-family: 微软雅黑; font-size: 10pt;"&gt;Microsoft.Web.Preview&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td style="border-top: none; border-left: none; border-bottom: solid #a3a3a3 1.0pt; border-right: solid #a3a3a3 1.0pt; padding: 5px;"&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0f243e; font-family: 微软雅黑; font-size: 10pt;"&gt;&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td style="border-top: none; border-left: solid #a3a3a3 1.0pt; border-bottom: solid #a3a3a3 1.0pt; border-right: solid #a3a3a3 1.0pt; padding: 5px;"&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0f243e; font-size: 10pt;"&gt;ASP.NET AJAX Control Toolkit&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td style="border-top: none; border-left: none; border-bottom: solid #a3a3a3 1.0pt; border-right: solid #a3a3a3 1.0pt; padding: 5px;"&gt;&#xD;
&lt;p&gt;&lt;span style="color: #30332d;"&gt;&lt;span style="font-family: Segoe UI; font-size: 10pt;"&gt;The current version of the AJAX Control Toolkit is not compatible with ASP.NET 2.0. The latest version that is compatible with ASP.NET 2.0 can be found here:&amp;nbsp;&lt;a href="http://ajaxcontroltoolkit.codeplex.com/releases/view/11121"&gt;20229&lt;/a&gt;&lt;/span&gt;&lt;span style="color: #0f243e; font-family: 微软雅黑; font-size: 10pt;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://ajaxcontroltoolkit.codeplex.com/releases/view/11121"&gt;&lt;span style="font-family: Segoe UI; font-size: 10pt;"&gt;AjaxControlToolkit.zip&lt;/span&gt;&lt;/a&gt;&lt;span style="color: #0f243e; font-family: 微软雅黑; font-size: 10pt;"&gt; &lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 12pt;"&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0f243e; font-size: 10pt;"&gt;&lt;span style="font-family: 微软雅黑;"&gt;包含全部空间&lt;/span&gt;,&lt;span style="font-family: 微软雅黑;"&gt; 测试框架, 示例网站及VSI&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td style="border-top: none; border-left: none; border-bottom: solid #a3a3a3 1.0pt; border-right: solid #a3a3a3 1.0pt; padding: 5px;"&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0f243e; font-family: 微软雅黑; font-size: 10pt;"&gt;AjaxControlToolkit.dll&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td style="border-top: none; border-left: none; border-bottom: solid #a3a3a3 1.0pt; border-right: solid #a3a3a3 1.0pt; padding: 5px;"&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0f243e; font-family: 微软雅黑; font-size: 10pt;"&gt;AjaxControlToolkit&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td style="border-top: none; border-left: none; border-bottom: solid #a3a3a3 1.0pt; border-right: solid #a3a3a3 1.0pt; padding: 5px;"&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0f243e; font-family: 微软雅黑; font-size: 10pt;"&gt;&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;&lt;span style="color: #0f243e; font-family: 微软雅黑; font-size: 10pt;"&gt;难得看到微软提供的.NET组件里, 程序集/命名空间的命名有这么乱的. 绝大多数情况下, .NET命名空间的组织严谨和达意都是让人满意的. &lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0f243e; font-family: 微软雅黑; font-size: 10pt;"&gt;但这里却也不该因为三个项目的开发形式/维护组织不同, 把命名搞的乱成这样, 既不整齐, 又不达意. &lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0f243e; font-family: 微软雅黑; font-size: 10pt;"&gt;协商好再开始多好, 否则代价就是今天下午这样, 比如要猜测Microsoft.Web.Preview.dll的功用, 害我像追破案线索一样, 搜索了两下才知道原来是当年的 "Future", Fu就Fu吧, 轮到给程序集起名字时还换个"Preview"! 惨痛!&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/yicone/aggbug/1915136.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/yicone/archive/2010/12/23/1915136.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/yicone/archive/2010/08/17/1801125.html</id><title type="text">尝试实现一个JavaScript MVC方案</title><summary type="text">此方案是一次将MVC的思想引入客户端的尝试. 结合AJAX ,并借鉴了一些ASP.NET MVC的实现模式.示例是一个简单的事件管理系统, 只有一个页面, 用户可以提交事件(post), 回复(reply). 页面打开时列表方式展现事件及回复.Controller公开一系列action 给调用方.action主要做三类事:1. 使用ajax方式与服务器端通信(ajax)2. 维护viewModel实例的状态3. 刷新页面的局部视图ControllerController引用着一个ViewModel的实例, ViewModel的定义如下:[代码]调用示例:这个示例是jquery版的, DOM中也</summary><published>2010-08-16T19:30:00Z</published><updated>2010-08-16T19:30:00Z</updated><author><name>yicone</name><uri>http://www.cnblogs.com/yicone/</uri></author><link rel="alternate" href="http://www.cnblogs.com/yicone/archive/2010/08/17/1801125.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yicone/archive/2010/08/17/1801125.html"/><content type="html">&lt;p&gt;此方案是一次将MVC的思想引入客户端的尝试. 结合AJAX ,&amp;nbsp;并借鉴了一些ASP.NET MVC的实现模式.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;示例是一个简单的事件管理系统, 只有一个页面, 用户可以提交事件(post), 回复(reply). 页面打开时列表方式展现事件及回复.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Controller公开一系列action 给调用方.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;action主要做三类事:&lt;/p&gt;&#xD;
&lt;p&gt;1. 使用ajax方式与服务器端通信(ajax)&lt;/p&gt;&#xD;
&lt;p&gt;2. 维护viewModel实例的状态&lt;/p&gt;&#xD;
&lt;p&gt;3. 刷新页面的局部视图&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('e16ad682-e9c6-487b-92d3-bda8c0315b34')"&gt;&#xD;
&lt;div id="cnblogs_code_open_e16ad682-e9c6-487b-92d3-bda8c0315b34" &gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #008080;"&gt; 1&lt;/span&gt; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; construct &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 2&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; Controller(){&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 3&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.viewModel &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; ViewModel();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt; &lt;span style="color: #000000;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 5&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 6&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; public methods &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt; &lt;span style="color: #000000;"&gt;Controller.prototype.index &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(){&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; controller &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 9&lt;/span&gt; &lt;span style="color: #000000;"&gt;    controller._bindEventList();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt; &lt;span style="color: #000000;"&gt;};&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt; &lt;span style="color: #000000;"&gt;Controller.prototype.post &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(title, content, callback){&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; controller &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt; &lt;span style="color: #000000;"&gt;    $.ajax(&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;/event/post&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;, {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;14&lt;/span&gt; &lt;span style="color: #000000;"&gt;        title: title,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;15&lt;/span&gt; &lt;span style="color: #000000;"&gt;        content: content&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;16&lt;/span&gt; &lt;span style="color: #000000;"&gt;    },&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;17&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(newEvent){&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;18&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (controller.viewModel.pageIndex &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;){&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;19&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; may be there are (pageSize + 1) items. &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;20&lt;/span&gt; &lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;            controller.viewModel.eventList.push(newEvent);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;21&lt;/span&gt; &lt;span style="color: #000000;"&gt;        } &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;22&lt;/span&gt; &lt;span style="color: #000000;"&gt;            controller.viewModel.pageSize &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;23&lt;/span&gt; &lt;span style="color: #000000;"&gt;            controller._bindEventList();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;24&lt;/span&gt; &lt;span style="color: #000000;"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;25&lt;/span&gt; &lt;span style="color: #000000;"&gt;        callback &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; callback();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;26&lt;/span&gt; &lt;span style="color: #000000;"&gt;    });&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;27&lt;/span&gt; &lt;span style="color: #000000;"&gt;};&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;28&lt;/span&gt; &lt;span style="color: #000000;"&gt;Controller.prototype.reply &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(eventId, content, callback){&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;29&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; controller &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;30&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; todo: 'find' need create&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;31&lt;/span&gt; &lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    controller.viewModel.selectedEvent &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; controller.viewModel.eventList.find(eventId);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;32&lt;/span&gt; &lt;span style="color: #000000;"&gt;    $.ajax(&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;/event/reply&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;, {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;33&lt;/span&gt; &lt;span style="color: #000000;"&gt;        eventId: controller.viewModel.selectedEvent.Id,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;34&lt;/span&gt; &lt;span style="color: #000000;"&gt;        content: content&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;35&lt;/span&gt; &lt;span style="color: #000000;"&gt;    },&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;36&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(newReply){&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;37&lt;/span&gt; &lt;span style="color: #000000;"&gt;        controller.viewModel.selectedEvent.ReplyList.push(newReply);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;38&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; still show(refresh) the page where the selected event in.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;39&lt;/span&gt; &lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        controller._bindEventList();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;40&lt;/span&gt; &lt;span style="color: #000000;"&gt;        callback &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; callback();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;41&lt;/span&gt; &lt;span style="color: #000000;"&gt;    });&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;42&lt;/span&gt; &lt;span style="color: #000000;"&gt;};&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;43&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;44&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; public events &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;45&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; refactory: use better solution replaces 'null'&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;46&lt;/span&gt; &lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Controller.prototype.afterEventListBinded &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;47&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;48&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; private methods &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;49&lt;/span&gt; &lt;span style="color: #000000;"&gt;Controller.prototype._bindEventList &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(callback){&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;50&lt;/span&gt; &lt;span style="color: #000000;"&gt;    $.ajax(&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;/event/list&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;, {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;51&lt;/span&gt; &lt;span style="color: #000000;"&gt;        pageSize: controller.viewModel.pageSize&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;52&lt;/span&gt; &lt;span style="color: #000000;"&gt;    },&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;53&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(result){&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;54&lt;/span&gt; &lt;span style="color: #000000;"&gt;        controller.viewModel.eventList &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; result.eventList;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;55&lt;/span&gt; &lt;span style="color: #000000;"&gt;        controller.viewModel.pageCount &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; result.pageCount;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;56&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; renderTemplate is a custom wrapper of jTemplates&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;57&lt;/span&gt; &lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        renderTemplate(&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;event-list&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;, {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;58&lt;/span&gt; &lt;span style="color: #000000;"&gt;            eventList: controller.viewModel.eventList,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;59&lt;/span&gt; &lt;span style="color: #000000;"&gt;            pageIndex: controller.viewModel.pageIndex,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;60&lt;/span&gt; &lt;span style="color: #000000;"&gt;            pageSize: controller.viewModel.pageSize,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;61&lt;/span&gt; &lt;span style="color: #000000;"&gt;            pageCount: controller.viewModel.pageCount&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;62&lt;/span&gt; &lt;span style="color: #000000;"&gt;        });&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;63&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;64&lt;/span&gt; &lt;span style="color: #000000;"&gt;        controller.afterEventListBinded &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; controller.afterEventListBinded();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;65&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;66&lt;/span&gt; &lt;span style="color: #000000;"&gt;        callback &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; callback();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;67&lt;/span&gt; &lt;span style="color: #000000;"&gt;    };&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;68&lt;/span&gt; &lt;span style="color: #000000;"&gt;};&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;69&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Controller引用着一个ViewModel的实例, ViewModel的定义如下:&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #008080;"&gt;1&lt;/span&gt; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; construct &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;2&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; ViewModel(){&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;3&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.eventList &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; [];&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;4&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.selectedEvent &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;5&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.pageIndex &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;6&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.pageSize &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;10&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;7&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.pageCount &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;8&lt;/span&gt; &lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;调用示例:&lt;/p&gt;&#xD;
&lt;p&gt;这个示例是jquery版的, DOM中也能看到jTemplates的影子(一个jquery插件), 但从思想到实现, 这个方案并不依赖于jquery, Controller中的两处外部依赖($.ajax和renderTemplate)完全可以寻找其他等价物替代.&lt;/p&gt;&#xD;
&lt;p&gt;此示例项目选用jquery和jTemplates完全是项目选型决定, 实现上只是借用了现成的便利.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #008080;"&gt; 1&lt;/span&gt; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; page ready &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 2&lt;/span&gt; &lt;span style="color: #000000;"&gt;$(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(){&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 3&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; controller &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Controller();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; event bind&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 5&lt;/span&gt; &lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    controller.afterEventListBinded &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(){&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 6&lt;/span&gt; &lt;span style="color: #000000;"&gt;        $(&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;.btnReply&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;).click(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(){&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; eventId &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; $(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;).attr(&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;eventId&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; content &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; $(&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;.txtReply&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;, $(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;).parent()).val();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 9&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt; &lt;span style="color: #000000;"&gt;            controller.reply(eventId, content,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(){&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt; &lt;span style="color: #000000;"&gt;                alert(&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;reply successful&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt; &lt;span style="color: #000000;"&gt;            });&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;14&lt;/span&gt; &lt;span style="color: #000000;"&gt;        });&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;15&lt;/span&gt; &lt;span style="color: #000000;"&gt;    };&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;16&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;17&lt;/span&gt; &lt;span style="color: #000000;"&gt;    controller.index();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;18&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;19&lt;/span&gt; &lt;span style="color: #000000;"&gt;    $(&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;#btnPost&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;).click(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(){&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;20&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; title &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; $(&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;#txtTitle&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;).val();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;21&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; content &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; $(&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;#txtContent&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;).val();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;22&lt;/span&gt; &lt;span style="color: #000000;"&gt;        controller.post(title, content,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;23&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(){&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;24&lt;/span&gt; &lt;span style="color: #000000;"&gt;            alert(&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;post successful&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;25&lt;/span&gt; &lt;span style="color: #000000;"&gt;        });&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;26&lt;/span&gt; &lt;span style="color: #000000;"&gt;    });&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;27&lt;/span&gt; &lt;span style="color: #000000;"&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('c0468c99-eb0c-4dea-b896-96e817c6da80')"&gt;&#xD;
&lt;div id="cnblogs_code_open_c0468c99-eb0c-4dea-b896-96e817c6da80" &gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #008080;"&gt; 1&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 2&lt;/span&gt; &lt;span style="color: #000000;"&gt;  &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;textarea &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;od&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="txtContent"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;textarea&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 3&lt;/span&gt; &lt;span style="color: #000000;"&gt;  &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;input &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="button"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; id&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="btnPost"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 5&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;div &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="event-list"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 6&lt;/span&gt; &lt;span style="color: #000000;"&gt;  &lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: #008000;"&gt; render template &lt;/span&gt;&lt;span style="color: #008000;"&gt;--&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt; &lt;span style="color: #000000;"&gt;  &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;textarea &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="event-list-template"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; class&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="template"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;ul&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 9&lt;/span&gt; &lt;span style="color: #000000;"&gt;      {#for $T.eventList as event }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt; &lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;li&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;{$T.event.title} | {$T.event.accountId} | {$T.event.insertDate}&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;{$T.event.content}&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt; &lt;span style="color: #000000;"&gt;        {#for $T.event.replyList as reply }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;14&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;{$T.reply.accoutId}| {$T.reply.insertDate}&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;15&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;{$T.reply.content}&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;16&lt;/span&gt; &lt;span style="color: #000000;"&gt;        {/#for}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;17&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;textarea &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;class&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="txtReply"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;textarea&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;18&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;input &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="button"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="reply"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; class&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="btnReply"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; eventId&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="{$T.event.eventId}"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;19&lt;/span&gt; &lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;li&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;20&lt;/span&gt; &lt;span style="color: #000000;"&gt;      {/#for} &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;21&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;ul&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;22&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;{$T.pageIndex} in {$T.pageSize}, total: {$T.pageCount}&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;23&lt;/span&gt; &lt;span style="color: #000000;"&gt;  &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;textarea&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;24&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;(DOM中 &amp;lt;textarea &amp;gt;... &amp;lt;/textarea&amp;gt;是一个 jTemplates 模板)&lt;/p&gt;&lt;img src="http://www.cnblogs.com/yicone/aggbug/1801125.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/yicone/archive/2010/08/17/1801125.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/yicone/archive/2010/05/27/1745758.html</id><title type="text">VS2010 &amp;quot;SQL Server 2005 Database Project&amp;quot; 使用笔记（二）</title><summary type="text">经过又一天的努力，终于让数据库项目全编通过。现在的解决方案里已经有十个项目了，其中八个数据库项目，一个服务器项目（SQL Server 2005 Server Project)，一个单元测试项目。直到下午还是满屏的Error，但经过不断的搜索（资料不多）和数次尝试，找到了关键问题和应对方法，后面就是对其余的项目重复几次这个过程，终于迎来了曙光。再次给出关于 数据库引用的资料链接(MSDN)简单整理...</summary><published>2010-05-27T13:12:00Z</published><updated>2010-05-27T13:12:00Z</updated><author><name>yicone</name><uri>http://www.cnblogs.com/yicone/</uri></author><link rel="alternate" href="http://www.cnblogs.com/yicone/archive/2010/05/27/1745758.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yicone/archive/2010/05/27/1745758.html"/><content type="html">&lt;p&gt;经过又一天的努力，终于让数据库项目全编通过。&lt;/p&gt;&#xD;
&lt;p&gt;现在的解决方案里已经有十个项目了，其中八个数据库项目，一个服务器项目（SQL Server 2005 Server Project)，一个单元测试项目。&lt;/p&gt;&#xD;
&lt;p&gt;直到下午还是满屏的Error，但经过不断的搜索（资料不多）和数次尝试，找到了关键问题和应对方法，后面就是对其余的项目重复几次这个过程，终于迎来了曙光。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;再次给出关于 数据库引用的&lt;a href="http://msdn.microsoft.com/zh-cn/library/bb386242.aspx"&gt;资料链接&lt;/a&gt;&amp;nbsp;(MSDN)&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;简单整理步骤如下：&lt;/p&gt;&#xD;
&lt;p&gt;1. 因为数据库中自定义的Schema对象依赖于&amp;ldquo;Login&amp;rdquo;，所以需要建立一个Server Project，导入master；&lt;/p&gt;&#xD;
&lt;p&gt;为了顺利Build该项目，需要&lt;strong&gt;添加对master.schema的引用&lt;/strong&gt;，该文件位于VS2010的安装目录，上面链接里有介绍。&lt;/p&gt;&#xD;
&lt;p&gt;2. 各数据库项目都添加对上述Server Project的引用，&lt;strong&gt;注意，&lt;/strong&gt;同时也要添加对 master.schema的引用 （这里只是急于解决问题，声明下&lt;strong&gt;不是&lt;/strong&gt;标准步骤）&lt;/p&gt;&#xD;
&lt;p&gt;3. 从最外围最少用的库对应的Database Project开始。先Unload掉其他Database Project，减少干扰，先集中精力消除项目自身的错误（非引用错误）。&lt;/p&gt;&#xD;
&lt;p&gt;自身错误主要是语法错误，语法错误一般很少，毕竟是实际在用的开发数据库。&lt;/p&gt;&#xD;
&lt;p&gt;今天只遇到一个SQL2000中FLOAT（m,n)无法通过SQL2005语法检查的问题。（意外发现这个升级遗留问题，这一方面也展现了VS对Schema进行静态检查的优秀功能，以及我们使用适当的工具辅助我们工作的必要性）&lt;/p&gt;&#xD;
&lt;p&gt;4. 接下来处理引用错误，就是那些视图，存储过程中包含对其他数据库对象的引用导致的错误。&lt;/p&gt;&#xD;
&lt;p&gt;还是那个减少干扰的思路，先从较为少用的库项目开始Reload。&lt;/p&gt;&#xD;
&lt;p&gt;这里有个关键细节，就是在添加数据库引用（项目型引用）时，相比昨天采用默认的参数，今天尝试了使用 Database Reference Variables, 因为数据库都在同一台服务器的原因，所以没使用Server Variable，只定义了Database variable。&lt;/p&gt;&#xD;
&lt;p&gt;没有勾选&amp;ldquo;Literal&amp;rdquo;。&lt;/p&gt;&#xD;
&lt;p&gt;"Name"栏输入数据库名称（当然输入别的合法变量名也没问题）。&lt;/p&gt;&#xD;
&lt;p&gt;"Value"输入数据库名称。Value可以在部署项目时修改为实际的名字，这点昨天提到过，数据库变量的一个作用就在于解决开发和部署的数据库名称差异问题。&lt;br /&gt;可以注意到，"Name&amp;rdquo;在编辑焦点离开后，会自动变成 $(Db1) 的形式，这也就是我们要在脚本中使用的表示其他数据库的变量。VS这里有个贴心并且体验良好的功能，勾选下面的&amp;ldquo;Updating Schema Objects and Scripts&amp;rdquo;，在确定后VS会自动找出已有的对其他数据库的引用，并自动替换为前面定义的变量，形式为 [$(Db1)]。如果手写的话，注意方括号（[])不缺少为妙。&lt;/p&gt;&#xD;
&lt;p&gt;在使用数据库变量之后，非常多的SQL03006错误自动闪躲。&lt;/p&gt;&#xD;
&lt;p&gt;在指定&amp;ldquo;Name&amp;rdquo;而不是使用&amp;ldquo;Literal&amp;rdquo;（文本方式引用数据库）之后，SQL04105也排队撤离。&lt;/p&gt;&#xD;
&lt;p&gt;（当然，这里提醒还是要好好阅读MSDN，&lt;strong&gt;搞清因果，结合需求&lt;/strong&gt;而行，并不是任何时候都要这么用，否则选项就没有提供的价值啦）&lt;/p&gt;&#xD;
&lt;p&gt;（文档中提到的复合项目，相比使用数据库引用，更适合一组数据库要协同部署的情况）&lt;/p&gt;&#xD;
&lt;p&gt;5. 在对所有数据库项目这么演练一番后，只剩下些散兵游勇。&lt;/p&gt;&#xD;
&lt;p&gt;我遇到的具体情况比较理想，清一色地视图里有昨天SQL03006 2）的情况，替换掉几个后，解决方案终于顺利全编通过。&lt;/p&gt;&#xD;
&lt;p&gt;6.（遗留）还有1083个警告，日后慢慢消化，边理解边解决。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;正好上午有个用户报了个BUG，估计和数据库访问有关，就顺手找到对应的存储过程文件，在Schema视图下，右键自动创建了对应的单元测试脚本，协助定位bug。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;享受劳动成果确实是件好事，虽然已经是下班后的事啦。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;P.S. 下一个需求是数据库单元测试，先放个今天偶然看到的资料&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.infoq.com/articles/tdd-dbpro-Foy"&gt;Test Driven Development with Visual Studio for Database Professionals&lt;/a&gt;&amp;nbsp;（InfoQ）&lt;/p&gt;&lt;img src="http://www.cnblogs.com/yicone/aggbug/1745758.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/yicone/archive/2010/05/27/1745758.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/yicone/archive/2010/05/26/1744745.html</id><title type="text">VS2010 &amp;quot;SQL Server 2005 Database Project&amp;quot; 使用笔记</title><summary type="text">今天尝试在VS 2010中使用SQL Server 2005 Database Project 管理一个老项目使用的若干数据库，主要目的有两个，一是为了还过去的&amp;ldquo;债&amp;rdquo;，半年前的一个分支版本由于以前一直没有对数据库进行相应的版本控制，导致目前将要进行的版本合并难以进行；二是为了今后避免此问题的发生。建立解决方案后，将几个数据库建立了同名项目，然后连接到开发数据库服务器，进行导...</summary><published>2010-05-26T13:18:00Z</published><updated>2010-05-26T13:18:00Z</updated><author><name>yicone</name><uri>http://www.cnblogs.com/yicone/</uri></author><link rel="alternate" href="http://www.cnblogs.com/yicone/archive/2010/05/26/1744745.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yicone/archive/2010/05/26/1744745.html"/><content type="html">&lt;p&gt;今天尝试在VS 2010中使用SQL Server 2005 Database Project 管理一个老项目使用的若干数据库，&lt;/p&gt;&#xD;
&lt;p&gt;主要目的有两个，一是为了还过去的&amp;ldquo;债&amp;rdquo;，半年前的一个分支版本由于以前一直没有对数据库进行相应的版本控制，导致目前将要进行的版本合并难以进行；&lt;/p&gt;&#xD;
&lt;p&gt;二是为了今后避免此问题的发生。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;建立解决方案后，将几个数据库建立了同名项目，然后连接到开发数据库服务器，进行导入。&lt;/p&gt;&#xD;
&lt;p&gt;导入完成后，试着Build解决方案，发现有非常之多的错误。&lt;/p&gt;&#xD;
&lt;p&gt;这一方面是由于工具试图规范化数据库对象的创建细节，增加了许多检查机制；&lt;/p&gt;&#xD;
&lt;p&gt;另一方面是因为自己尚未了解VS &amp;ldquo;Database Project&amp;rdquo;的一些工作机制，忽略了必要的步骤。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;下面简述下主要的错误类型。&lt;/p&gt;&#xD;
&lt;p&gt;SQL03006&lt;/p&gt;&#xD;
&lt;p&gt;处理笔记：&lt;/p&gt;&#xD;
&lt;p&gt;这个错误占了非常高的比例，但也要分为两种情形看待&lt;/p&gt;&#xD;
&lt;p&gt;1） 前面提到尚未了解&amp;ldquo;Database Project&amp;rdquo;的一些工作机制，导致产生了一些错误。这里就是今天遇到的具体问题。&lt;/p&gt;&#xD;
&lt;p&gt;已知数据库A和B，如果A的对象脚本（如存储过程）引用了B库中的对象，VS为了正确的建立依赖关系以供分析，要求添加&amp;ldquo;数据库引用&amp;rdquo;。请参考 &lt;a target="_blank" href="http://msdn.microsoft.com/zh-cn/library/bb386242.aspx"&gt;在数据库项目中使用引用&lt;/a&gt;（MSDN)。&lt;/p&gt;&#xD;
&lt;p&gt;2）已知数据库A，如果A的对象脚本中包含了对A数据库内其他对象的引用（如表T_B)，则不要使用 [A].[dbo].[T_B]的书写形式，使用[T_B]即可。&lt;/p&gt;&#xD;
&lt;p&gt;对于这一点，其实是很有疑惑的，&lt;strong&gt;尚不确定&lt;/strong&gt;是否是VS Database Project 强制的编码规范。&lt;/p&gt;&#xD;
&lt;p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px;"&gt;暂时忽略了对这个问题的细究， 先在VS中用查找替换的方法解决。查找范围设为&amp;rdquo;当前项目&amp;ldquo;（Current Project），将&amp;ldquo;[A].[dbo].&amp;rdquo;批量替换为空（&amp;ldquo;&amp;rdquo;）。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;SQL04105&lt;/p&gt;&#xD;
&lt;p&gt;处理笔记:&lt;/p&gt;&#xD;
&lt;p&gt;1) A数据库引用了B数据库，A库中和B库中有相同命名的对象，则可能导致该错误。&lt;/p&gt;&#xD;
&lt;p&gt;解决办法为在A库中引用B库对象的地方，使用&amp;ldquo;数据库限定名称&amp;rdquo;（[database].[schema].[object]）。&lt;/p&gt;&#xD;
&lt;p&gt;该问题有很多衍生情形，所以建议阅读 &lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/539211/db-projects-with-same-object-names-cannot-be-used-as-database-reference-error-sql04105" target="_blank"&gt;这里&lt;/a&gt;&amp;nbsp;（MSDN)。&lt;/p&gt;&#xD;
&lt;p&gt;另外在搜索&amp;ldquo;&amp;rdquo;时还看到这个&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/532540/schema-import-creates-duplicate-objects" target="_blank"&gt;问题&lt;/a&gt;，提问者是在导入一个曾经从SQL Server 2000升级到2005的数据库时遇到问题，看回复的意思是说&amp;ldquo;有BUG，RTM不修复了，等着the service release of Visual Studio 2010吧&amp;rdquo;。（不知道这是什么版本，SP吗？）&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;其他重要注意事项：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/aa833270.aspx#DependenciesAndUpdateScripts" target="_blank"&gt;关于数据库项目、生成和部署问题的疑难解答&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;个人认为这是个比较重要的FAQ文档。&lt;/p&gt;&#xD;
&lt;p&gt;其中提到在遇到其中的一些问题时，要 试着&amp;ldquo;刷新&amp;rdquo; 或 试着&amp;ldquo;同步&amp;rdquo;。&lt;/p&gt;&#xD;
&lt;p&gt;（题外话， 这种&amp;ldquo;神奇按钮&amp;rdquo;，我们在编辑器中有&amp;ldquo;保存&amp;rdquo;，在浏览器中有&amp;ldquo;刷新&amp;rdquo;，所以并不陌生。其实很恐惧这样的描述，因为自己总是没信心记住哪些情形需要额外点一下这些&amp;ldquo;神奇按钮&amp;rdquo;！直接后果就是当遇到VS表现的非吾所愿时，病急乱投医般把这种&amp;ldquo;神奇按钮&amp;rdquo;狂点一番。难免会浪费时间，工作压力大时可能还会被狂点无效后激怒）&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;遗留的其他问题：&lt;/p&gt;&#xD;
&lt;p&gt;在引用其他数据库时，如果不对引用的数据库定义 SQLCMD 变量， 会对发布有何影响？&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;目前仅知道通过变量引用而不是直接引用， 可以解决部署时&amp;ldquo;目标服务器的名称可能与生产环境中目标服务器的名称不同&amp;rdquo;的情况。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/yicone/aggbug/1744745.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/yicone/archive/2010/05/26/1744745.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/yicone/archive/2010/01/18/1650294.html</id><title type="text">腳印: 初學者的心態</title><summary type="text">朋友在做一個類似SpeedText 的IPhone 軟件, 實做下來, 目前性能和筆畫的流暢優美程度都不及這個日本人做的小軟件. 這是周六晚上閑來無趣, 跟朋友聊天時談到的, 這個軟件的用途是, 找回過去人們寫信讀信的感覺, 將字跡or書法躍然于信紙(圖片)之上, 發送到友人的郵箱中. 順著朋友的指引, 知道了要想做到筆畫流暢, 一般采用調用貝塞爾函數的方式來連接點. 于是找到一個同事, 給自己做...</summary><published>2010-01-17T18:54:00Z</published><updated>2010-01-17T18:54:00Z</updated><author><name>yicone</name><uri>http://www.cnblogs.com/yicone/</uri></author><link rel="alternate" href="http://www.cnblogs.com/yicone/archive/2010/01/18/1650294.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yicone/archive/2010/01/18/1650294.html"/></entry><entry><id>http://www.cnblogs.com/yicone/archive/2010/01/18/1650288.html</id><title type="text">[架構模式實踐]如何不讓第三方服務的故障阻礙開發和測試進度</title><summary type="text">今天起床后發現陽光明媚. 平日里鉆在暗無天日的辦公室里, 是沒有機會體會到這冬日正午的暖陽, 是多么的讓人流連.靠在床頭, 伸了個懶腰, 慵懶地捧起了一直無暇去讀的企業應用架構模式. 那一刻, 陽光照在書本上, 雖然有些晃眼, 但是不妨礙一種細小的滿足感默默誕生.前日和一名同事閑聊, 提到了一段時間來一起參與的一個項目, 這個項目的一個特點是用到了數量較多形式各異的第三方接口, 算是&amp;quot;傳說中的&amp;quot;企業級應用吧:) 在前面的一輪測試過程中, 由于其中一些接口的測試環境頻頻當機或服務中斷, 導致測試和修改bug的過程都耽擱了不少時間, 于是同事提議, 做一些這些接口的替代品, 來</summary><published>2010-01-17T18:02:00Z</published><updated>2010-01-17T18:02:00Z</updated><author><name>yicone</name><uri>http://www.cnblogs.com/yicone/</uri></author><link rel="alternate" href="http://www.cnblogs.com/yicone/archive/2010/01/18/1650288.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yicone/archive/2010/01/18/1650288.html"/></entry><entry><id>http://www.cnblogs.com/yicone/archive/2010/01/17/1650244.html</id><title type="text">[GAE應用開發]用Ulipad搭建GAE應用程序的開發環境</title><summary type="text">其實這個環境, 之前就以經參照網絡上的資料搭建好了, 無奈筆頭不勤, 偏又趕上操作系統重裝, 所以無奈又將遇到的問題一一搜索. 害怕今后重蹈覆轍, 所以這次就乖一些, 把問題記錄下來.本人機器上的操作系統是Win7, 以下第三步在其他Windows環境下不一定是必須.步驟:一 安裝Ulipad1. 安裝Ulipad, 安裝包可從google code 獲取2. 在Ulipad的安裝目錄下, 新建config.ini文件, 編輯內容:[default]debug = 0pythonpath = &amp;quot;C:\Program Files\Google\google_appengine&amp;quot</summary><published>2010-01-17T15:32:00Z</published><updated>2010-01-17T15:32:00Z</updated><author><name>yicone</name><uri>http://www.cnblogs.com/yicone/</uri></author><link rel="alternate" href="http://www.cnblogs.com/yicone/archive/2010/01/17/1650244.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yicone/archive/2010/01/17/1650244.html"/></entry><entry><id>http://www.cnblogs.com/yicone/archive/2009/10/26/1590183.html</id><title type="text">脚印: SD2C 2009 参会小记(非技术篇)</title><summary type="text">此次大会的主题包括云计算, 手机应用开发和软件创富, 敏捷开发, DSL,下一代互联网, 企业开发等, 这些主题基本上涵盖了当前国内软件开发的热点领域, 反应了当前的技术趋势. 由于课程是几个主题并行开设的, 所以只选择了一些感兴趣的课程, 比较喜欢的有 蔡学镛的 DSL的设计与实践, 云风的 C/C++与 Lua的混合编程  钱宏武的 大企业系统设计及其大互联网系统设计之异同  卢育圣的 发现A...</summary><published>2009-10-26T12:14:00Z</published><updated>2009-10-26T12:14:00Z</updated><author><name>yicone</name><uri>http://www.cnblogs.com/yicone/</uri></author><link rel="alternate" href="http://www.cnblogs.com/yicone/archive/2009/10/26/1590183.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yicone/archive/2009/10/26/1590183.html"/></entry></feed>
