﻿<?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>博客园-beyondjay</title><link>http://www.cnblogs.com/beyondjay/</link><description /><language>zh-cn</language><lastBuildDate>Wed, 20 Aug 2008 21:22:32 GMT</lastBuildDate><pubDate>Wed, 20 Aug 2008 21:22:32 GMT</pubDate><ttl>60</ttl><item><title>Rendering n-column tables using the Repeater control（转载）</title><link>http://www.cnblogs.com/beyondjay/archive/2008/08/12/1266023.html</link><dc:creator>Tony Zhou</dc:creator><author>Tony Zhou</author><pubDate>Tue, 12 Aug 2008 07:31:00 GMT</pubDate><guid>http://www.cnblogs.com/beyondjay/archive/2008/08/12/1266023.html</guid><wfw:comment>http://www.cnblogs.com/beyondjay/comments/1266023.html</wfw:comment><comments>http://www.cnblogs.com/beyondjay/archive/2008/08/12/1266023.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/beyondjay/comments/commentRss/1266023.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/beyondjay/services/trackbacks/1266023.html</trackback:ping><description><![CDATA[<p><font face="Verdana">ref:<a href="http://blogs.msdn.com/aribeiro/articles/351439.aspx">http://blogs.msdn.com/aribeiro/articles/351439.aspx</a></font></p>
<h2>Rendering n-column tables using the Repeater control</h2>
<div class="postcontent">
<p><font face="Arial" size="2">The ASP.NET <strong>Repeater </strong>control provides a template-based mechanism for rendering data using Data Binding. A basic usage sample can be found <font face="Arial" size="2"><a href="http://samples.gotdotnet.com/quickstart/aspplus/doc/webdatalist.aspx">here</a> </font>. </font></p>
<p><font face="Arial" size="2">The control uses the &lt;ItemTemplate&gt; tag&nbsp;for declaring HTML that should be rendered for each data item and a &lt;SeparatorTemplate&gt; tag to put some HTML between items. It also supports an &lt;AlternatingItemTemplate&gt; that can useful to render a fancy mixed two-color list or, more seriously, a two-column table. An example:</font></p>
<p><strong><font face="Arial" size="2">Page1.aspx</font></strong></p>
<p class="cs"><font face="Courier New" size="2">&nbsp;&nbsp;&nbsp; &lt;table border="1"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;asp:Repeater id="Repeater1" runat="server"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ItemTemplate&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;%# DataBinder.Eval(Container.DataItem, "ProductName") %&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/td&gt;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ItemTemplate&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;AlternatingItemTemplate&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;%# DataBinder.Eval(Container.DataItem, "ProductName") %&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/AlternatingItemTemplate&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/asp:Repeater&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/table&gt;</font></p>
<p><strong><font face="Arial" size="2">Page1.cs</font></strong></p>
<p class="cs"><font face="Courier New" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected System.Web.UI.WebControls.Repeater Repeater1;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private void Page_Load(object sender, System.EventArgs e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlConnection connection = new SqlConnection("Data Source=(local);Initial Catalog=Northwind;Integrated Security=SSPI;");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlCommand command = new SqlCommand("SELECT TOP 15 ProductId, ProductName FROM Products", connection); </font></p>
<p class="cs"><font face="Courier New" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connection.Open(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Repeater1.DataSource = command.ExecuteReader(CommandBehavior.CloseConnection);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Repeater1.DataBind();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p class="text"><strong><font face="Arial" size="2">Resulting HTML</font></strong></p>
<table id="table2" border="1">
    <tr>
            <td>
            <p class="text"><font face="Arial" size="2">Alice Mutton </font></p>
            </td>
            <td>
            <p class="text"><font face="Arial" size="2">Aniseed Syrup </font></p>
            </td>
        </tr>
        <tr>
            <td>
            <p class="text"><font face="Arial" size="2">Boston Crab Meat </font></p>
            </td>
            <td>
            <p class="text"><font face="Arial" size="2">Camembert Pierrot </font></p>
            </td>
        </tr>
        <tr>
            <td>
            <p class="text"><font face="Arial" size="2">Carnarvon Tigers </font></p>
            </td>
            <td>
            <p class="text"><font face="Arial" size="2">Chai </font></p>
            </td>
        </tr>
        <tr>
            <td>
            <p class="text"><font face="Arial" size="2">Chang </font></p>
            </td>
            <td>
            <p class="text"><font face="Arial" size="2">Chartreuse verte </font></p>
            </td>
        </tr>
        <tr>
            <td>
            <p class="text"><font face="Arial" size="2">Chef Anton's Cajun Seasoning </font></p>
            </td>
            <td>
            <p class="text"><font face="Arial" size="2">Chef Anton's Gumbo Mix </font></p>
            </td>
        </tr>
        <tr>
            <td>
            <p class="text"><font face="Arial" size="2">Chocolade </font></p>
            </td>
            <td>
            <p class="text"><font face="Arial" size="2">C&#244;te de Blaye </font></p>
            </td>
        </tr>
        <tr>
            <td>
            <p class="text"><font face="Arial" size="2">Escargots de Bourgogne </font></p>
            </td>
            <td>
            <p class="text"><font face="Arial" size="2">Filo Mix </font></p>
            </td>
        </tr>
        <tr>
            <td>
            <p class="text"><font face="Arial" size="2">Flotemysost </font></p>
            </td>
        </tr>
    </table>
<p class="text"><font face="Arial" size="2">But what if need to render, lets say, a 3-column table? </font></p>
<table id="table3" border="1">
    <tr>
            <td><font face="Arial" size="2">Alice Mutton</font></td>
            <td><font face="Arial" size="2">Aniseed Syrup</font></td>
            <td><font face="Arial" size="2">Boston Crab Meat</font></td>
        </tr>
        <tr>
            <td><font face="Arial" size="2">Camembert Pierrot</font></td>
            <td><font face="Arial" size="2">Carnarvon Tigers</font></td>
            <td><font face="Arial" size="2">Chai</font></td>
        </tr>
        <tr>
            <td><font face="Arial" size="2">Chang</font></td>
            <td><font face="Arial" size="2">Chartreuse verte</font></td>
            <td><font face="Arial" size="2">Chef Anton's Cajun Seasoning</font></td>
        </tr>
        <tr>
            <td><font face="Arial" size="2">Chef Anton's Gumbo Mix</font></td>
            <td><font face="Arial" size="2">Chocolade</font></td>
            <td><font face="Arial" size="2">C&#244;te de Blaye</font></td>
        </tr>
        <tr>
            <td><font face="Arial" size="2">Escargots de Bourgogne</font></td>
            <td><font face="Arial" size="2">Filo Mix</font></td>
            <td><font face="Arial" size="2">Flotemysost</font></td>
        </tr>
    </table>
<p class="text"><font face="Arial" size="2">And generically, a n-column table?</font></p>
<p class="text"><font face="Arial" size="2">There's no &lt;n-AlternatingItemTemplate&gt; tag for this purpose. Yes, you could just programatically render the required HTML, loosing the design-time support. But you can also achieve this using a <strong>template-based </strong>approach maintaining design time support, using <strong>Data Binding events</strong>. Here's how.</font></p>
<p class="text"><font face="Arial" size="2"></font>&nbsp;</p>
<p class="text"><font face="Arial">A 3-column table using a template-based Repeater</font></p>
<p class="text"><font face="Arial" size="2">To produce a 3-column table, all you need is render a &lt;TD&gt;...&lt;/TD&gt; for each data item, and render a &lt;/TR&gt;&lt;TR&gt; every 3 items. Besides, you should place a &lt;TR&gt; befere the first item and a &lt;/TR&gt; after the last item.</font></p>
<p class="text"><font face="Arial" size="2">The difficult part on this is the <em>"render a &lt;/TR&gt;&lt;TR&gt; every 3 items" </em>thing. How can this be achieved using Data Binding? The answer is the ItemDataBound event.</font></p>
<p class="text"><font face="Arial" size="2">When you invoke DataBind() method on a Data Binding enabled control, you can subscribe an event that is fired when each item is rendered. With some coding on this event, you can programmatically change the presentation of a specific data item. With this in mind, you can just count the items being rendered, and show or hide a separator &lt;/TR&gt;&lt;TR&gt; every three items.</font></p>
<p class="text"><font face="Arial" size="2">A full example:</font></p>
<p><font face="Arial" size="2"></font>
<p><font face="Arial" size="2"></font></p>
<p><strong><font face="Arial" size="2">Page1.aspx</font></strong></p>
<p class="cs"><font face="Courier New" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;table border="1"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;asp:Repeater id="Repeater1" runat="server"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ItemTemplate&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;%# DataBinder.Eval(Container.DataItem, "ProductName") %&gt;&lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ItemTemplate&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;SeparatorTemplate&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/SeparatorTemplate&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/asp:Repeater&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/table&gt;<br />
</font><br />
<strong><font face="Arial" size="2">Page1.cs</font></strong></p>
<p class="cs"><font face="Courier New" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;protected System.Web.UI.WebControls.Repeater Repeater1;<br />
</font><font face="Courier New" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;protected int counter = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;protected int columnCount = 3;</font><font face="Courier New"><br />
<br />
<font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private void Page_Load(object sender, System.EventArgs e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlConnection connection = new SqlConnection("Data Source=(local);Initial Catalog=Northwind;Integrated Security=SSPI;");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlCommand command = new SqlCommand("SELECT TOP 15 ProductId, ProductName FROM Products", connection); </font></font></p>
<p class="cs"><font face="Courier New" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connection.Open();&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;Repeater1.DataSource = command.ExecuteReader(CommandBehavior.CloseConnection);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Repeater1.ItemDataBound +=new RepeaterItemEventHandler(Repeater1_ItemDataBound);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Repeater1.DataBind();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p class="cs"><font face="Courier New" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (e.Item.ItemType == ListItemType.Separator)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if((++counter % columnCount) != 0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.Item.Visible = false;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p class="text"><font face="Arial" size="2">Cool?<font face="Verdana">To get the full source code for this sample e-mail the author aribeiro@microsoft.com</font></font></p>
</div>
<img src ="http://www.cnblogs.com/beyondjay/aggbug/1266023.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41802/" target="_blank">[新闻]微软Office 14即将展开Alpha测试</a>]]></description></item><item><title>jQuery Ajax 全解析（转载）</title><link>http://www.cnblogs.com/beyondjay/archive/2008/08/01/1258396.html</link><dc:creator>Tony Zhou</dc:creator><author>Tony Zhou</author><pubDate>Fri, 01 Aug 2008 10:09:00 GMT</pubDate><guid>http://www.cnblogs.com/beyondjay/archive/2008/08/01/1258396.html</guid><wfw:comment>http://www.cnblogs.com/beyondjay/comments/1258396.html</wfw:comment><comments>http://www.cnblogs.com/beyondjay/archive/2008/08/01/1258396.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/beyondjay/comments/commentRss/1258396.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/beyondjay/services/trackbacks/1258396.html</trackback:ping><description><![CDATA[摘要: jQuery Ajax 全解析 	本文地址: jQuery Ajax 全解析本文作者：QLeelulu转载请标明出处！jQuery确实是一个挺好的轻量级的JS框架，能帮助我们快速的开发JS应用，并在一定程度上改变了我们写JavaScript代码的习惯。废话少说，直接进入正题，我们先来看一些简单的方法，这些方法都是对jQuery.ajax()进行封装以方便我们使用的方法，当然，如果要处理复杂的逻辑，&nbsp;&nbsp;<a href='http://www.cnblogs.com/beyondjay/archive/2008/08/01/1258396.html'>阅读全文</a><img src ="http://www.cnblogs.com/beyondjay/aggbug/1258396.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41801/" target="_blank">[新闻]《星际争霸2》新图</a>]]></description></item><item><title>JQuery手册</title><link>http://www.cnblogs.com/beyondjay/archive/2008/08/01/1258208.html</link><dc:creator>Tony Zhou</dc:creator><author>Tony Zhou</author><pubDate>Fri, 01 Aug 2008 07:11:00 GMT</pubDate><guid>http://www.cnblogs.com/beyondjay/archive/2008/08/01/1258208.html</guid><wfw:comment>http://www.cnblogs.com/beyondjay/comments/1258208.html</wfw:comment><comments>http://www.cnblogs.com/beyondjay/archive/2008/08/01/1258208.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/beyondjay/comments/commentRss/1258208.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/beyondjay/services/trackbacks/1258208.html</trackback:ping><description><![CDATA[摘要: 翻译整理：Young.J官方网站：http://jquery.com jQuery是一款同prototype一样优秀js开发库类，特别是对css和XPath的支持，使我们写js变得更加方便！如果你不是个js高手又想写出优 秀的js效果，jQuery可以帮你达到目的！ 下载地址：Starterkit （http://jquery.bassistance.de/jquery-starterkit.zi&nbsp;&nbsp;<a href='http://www.cnblogs.com/beyondjay/archive/2008/08/01/1258208.html'>阅读全文</a><img src ="http://www.cnblogs.com/beyondjay/aggbug/1258208.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41801/" target="_blank">[新闻]《星际争霸2》新图</a>]]></description></item><item><title>AJAX开发</title><link>http://www.cnblogs.com/beyondjay/archive/2008/08/01/1258206.html</link><dc:creator>Tony Zhou</dc:creator><author>Tony Zhou</author><pubDate>Fri, 01 Aug 2008 07:10:00 GMT</pubDate><guid>http://www.cnblogs.com/beyondjay/archive/2008/08/01/1258206.html</guid><wfw:comment>http://www.cnblogs.com/beyondjay/comments/1258206.html</wfw:comment><comments>http://www.cnblogs.com/beyondjay/archive/2008/08/01/1258206.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/beyondjay/comments/commentRss/1258206.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/beyondjay/services/trackbacks/1258206.html</trackback:ping><description><![CDATA[摘要: 七、AJAX开发到这里，已经可以清楚的知道AJAX是什么，AJAX能做什么，AJAX什么地方不好。如果你觉得AJAX真的能给你的开发工作带来改进的话，那么继续看看怎么使用AJAX吧。7.1、AJAX应用到的技术AJAX涉及到的7项技术中，个人认为Javascript、XMLHttpRequest、DOM、XML比较有用。A、XMLHttpRequest对象XMLHttpRequest是XMLHTT&nbsp;&nbsp;<a href='http://www.cnblogs.com/beyondjay/archive/2008/08/01/1258206.html'>阅读全文</a><img src ="http://www.cnblogs.com/beyondjay/aggbug/1258206.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41801/" target="_blank">[新闻]《星际争霸2》新图</a>]]></description></item><item><title>将windows services制作成MSI安装程序</title><link>http://www.cnblogs.com/beyondjay/archive/2008/07/09/1238678.html</link><dc:creator>Tony Zhou</dc:creator><author>Tony Zhou</author><pubDate>Wed, 09 Jul 2008 02:23:00 GMT</pubDate><guid>http://www.cnblogs.com/beyondjay/archive/2008/07/09/1238678.html</guid><wfw:comment>http://www.cnblogs.com/beyondjay/comments/1238678.html</wfw:comment><comments>http://www.cnblogs.com/beyondjay/archive/2008/07/09/1238678.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/beyondjay/comments/commentRss/1238678.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/beyondjay/services/trackbacks/1238678.html</trackback:ping><description><![CDATA[1、创建新的&#8220;安装项目&#8221;项目；<br />
2、在解决方案资源管理器中添加相应的所有项目文件（在项目上右键&#8220;添加&#8221;—&gt;&#8220;文件&#8221;）；<br />
3、在解决方案资源管理器上方 点击&#8220;自定义操作编辑器&#8221;；<br />
4、在&#8220;自定义操作&#8221;视图中，点击&#8220;安装&#8221;，右击&#8220;添加自定义操作&#8221;，在弹出窗口&#8220;选择项目中的项&#8221;中选择对应的windows service所在的EXE文件，点击确定；<br />
5、在&#8220;安装&#8221;下点击上一步选择的windows service程序文件，在属性窗口中设置参数(Arguments)为 &#8220;/install&#8221; ；（这一步可让安装程序MSI自动安装好Windows service）<br />
6、同样在&#8220;卸装&#8221;项中添加windows service所在的EXE文件，并在属性窗口中设置参数(Arguments)为 &#8220;/uninstall&#8221; ；（这一步可以在&#8220;添加/删除程序&#8221;时自动卸装Windows service）<br />
7、生成项目文件就OK了。&nbsp; <br />
<br />
<br />
<span id="intelliTXT">
<h3>o build your service project</h3>
<ol>
    <li>In Solution Explorer, right-click your project and select <em>Properties</em> from the shortcut menu. The project's <em>Property Pages</em> dialog box appears.
    </li>
    <li>In the left pane, select the <em>General</em> tab in the <em>Common Properties</em> folder.
    </li>
    <li>From the <code lang="cs">Startup <span class="code-keyword">object</span></code> list, choose <code lang="cs">MyNewService</code>. Click OK.
    </li>
    <li>Press Ctrl+Shift+B to build the project.&nbsp; </li>
</ol>
<p><img alt="Service Project Property Page" src="http://www.codeproject.com/KB/dotnet/SimpleWindowsService/projProb.jpg" height="338" width="500" /></p>
<p>Now that the project is built, it can be deployed. A setup project
will install the compiled project files and run the installers needed
to run the Windows service. To create a complete setup project, you
will need to add the project output, <em>MyNewService.exe</em>, to the setup project and then add a custom action to have <em>MyNewService.exe</em> installed.</p>
<h3>To create a setup project for your service</h3>
<ol>
    <li>On the <em>File</em> menu, point to <em>Add Project</em>, and then choose <em>New Project</em>.
    </li>
    <li>In the <em>Project Types</em> pane, select the <em>Setup and Deployment Projects</em> folder.
    </li>
    <li>In the <em>Templates</em> pane, select <em>Setup Project</em>. Name the project <code lang="cs">MyServiceSetup</code>. </li>
</ol>
<p>A setup project is added to the solution. Next you will add the output from the Windows service project, <em>MyNewService.exe</em>, to the setup.</p>
<p><img alt="Service Setup Project" src="http://www.codeproject.com/KB/dotnet/SimpleWindowsService/servicesetupproj.jpg" height="338" width="500" /></p>
<h3>To add MyNewService.exe to the setup project</h3>
<ol>
    <li>In Solution Explorer, right-click <code lang="cs">MyServiceSetup</code>, point to <em>Add</em>, then choose <em>Project Output</em>. The <em>Add Project Output Group</em> dialog box appears.
    </li>
    <li><code lang="cs">MyNewService</code> is selected in the <em>Project</em> box.
    </li>
    <li>From the list box, select <em>Primary Output</em>, and click OK.
    <p>A project item for the primary output of <code lang="cs">MyNewService</code> is added to the setup project. Now add a custom action to install the <em>MyNewService.exe</em> file.</p>
    </li>
</ol>
<h3>To add a custom action to the setup project</h3>
<ol>
    <li>In Solution Explorer, right-click the setup project, point to <em>View</em>, then choose <em>Custom Actions</em>. The <em>Custom Actions</em> editor appears.
    </li>
    <li>In the <em>Custom Actions</em> editor, right-click the <em>Custom Actions</em> node and choose <em>Add Custom Action</em>. The <em>Select Item</em> in <em>Project</em> dialog box appears.
    </li>
    <li>Double-click the application folder in the list box to open it, select primary output from <code lang="cs">MyNewService</code>
    (Active), and click OK. The primary output is added to all four nodes
    of the custom actions — Install, Commit, Rollback, and Uninstall. </li>
    <li>Build the setup project. </li>
</ol>
</span><br />
<img src ="http://www.cnblogs.com/beyondjay/aggbug/1238678.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41800/" target="_blank">[新闻]Google放出Android开发路线图</a>]]></description></item><item><title>生成repeater分页的页码，可以想datagrid一样分页。需要配合PagedDataSource 。</title><link>http://www.cnblogs.com/beyondjay/archive/2008/06/17/1224139.html</link><dc:creator>Tony Zhou</dc:creator><author>Tony Zhou</author><pubDate>Tue, 17 Jun 2008 09:04:00 GMT</pubDate><guid>http://www.cnblogs.com/beyondjay/archive/2008/06/17/1224139.html</guid><wfw:comment>http://www.cnblogs.com/beyondjay/comments/1224139.html</wfw:comment><comments>http://www.cnblogs.com/beyondjay/archive/2008/06/17/1224139.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/beyondjay/comments/commentRss/1224139.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/beyondjay/services/trackbacks/1224139.html</trackback:ping><description><![CDATA[<font face="Verdana">
<p>生成repeater分页的页码，可以想datagrid一样点击。需要配合PagedDataSource 。</p>
<p>public string CreatePagerLinks(PagedDataSource objPds, string BaseUrl)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;int totalPageRanger = 3;//set page range is 5, means display five hyperlink for page selection<br />
&nbsp;&nbsp;&nbsp;int pageRanger = (totalPageRanger-1)/2;</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;StringBuilder sbPager = new StringBuilder();</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;if (!objPds.IsFirstPage)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;// first page link<br />
&nbsp;&nbsp;&nbsp;&nbsp;sbPager.Append("&lt;a href=\"");<br />
&nbsp;&nbsp;&nbsp;&nbsp;sbPager.Append(BaseUrl);<br />
&nbsp;&nbsp;&nbsp;&nbsp;sbPager.Append("\"&gt;|&lt;&lt;/a&gt; ");<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (objPds.CurrentPageIndex != 1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// previous page link<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbPager.Append("&lt;a href=\"");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbPager.Append(BaseUrl);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbPager.Append("&amp;page=");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbPager.Append(objPds.CurrentPageIndex.ToString());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbPager.Append("\" alt=\"Previous Page\"&gt;&lt;&lt;&lt;/a&gt;&nbsp; ");<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;}</font></p>
<font face="Verdana">
<p><br />
&nbsp;&nbsp;&nbsp;int intLow = objPds.CurrentPageIndex + 1 - pageRanger;//pageindex + 1 = pagenumber<br />
&nbsp;&nbsp;&nbsp;int intHigh = objPds.CurrentPageIndex + 1 + pageRanger;//pageindex + 1 = pagenumber</p>
<p>&nbsp;&nbsp;&nbsp;if (intLow &lt; 1) intLow = 1;<br />
&nbsp;&nbsp;&nbsp;if (intHigh &gt; objPds.PageCount) intHigh = objPds.PageCount;</p>
<p>&nbsp;&nbsp;&nbsp;if (intHigh - intLow &lt; totalPageRanger) <br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;intHigh = intLow + totalPageRanger - 1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (intHigh &gt; objPds.PageCount)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;intHigh = objPds.PageCount;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;if (intHigh - intLow &lt; totalPageRanger) <br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;intLow = intHigh - totalPageRanger + 1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (intLow &lt; 1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;intLow = 1;<br />
&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;for (int x = intLow; x &lt;= intHigh ; x++)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;// numeric links<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (x == objPds.CurrentPageIndex + 1) sbPager.Append(x.ToString() + "&nbsp; ");<br />
&nbsp;&nbsp;&nbsp;&nbsp;else<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbPager.Append("&lt;a href=\"");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbPager.Append(BaseUrl);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbPager.Append("&amp;page=");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbPager.Append(x.ToString());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbPager.Append("\"&gt;");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbPager.Append(x.ToString());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbPager.Append("&lt;/a&gt;&nbsp; " );<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;if (!objPds.IsLastPage)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;if ((objPds.CurrentPageIndex + 2) != objPds.PageCount)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// next page link<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbPager.Append("&lt;a href=\"");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbPager.Append(BaseUrl);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbPager.Append("&amp;page=");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbPager.Append(Convert.ToString(objPds.CurrentPageIndex + 2));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbPager.Append("\"&gt;&gt;&gt;&lt;/a&gt;&nbsp; ");<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;// last page link<br />
&nbsp;&nbsp;&nbsp;&nbsp;sbPager.Append("&lt;a href=\"");<br />
&nbsp;&nbsp;&nbsp;&nbsp;sbPager.Append(BaseUrl);<br />
&nbsp;&nbsp;&nbsp;&nbsp;sbPager.Append("&amp;page=");<br />
&nbsp;&nbsp;&nbsp;&nbsp;sbPager.Append(objPds.PageCount.ToString());<br />
&nbsp;&nbsp;&nbsp;&nbsp;sbPager.Append("\"&gt;&gt;|&lt;/a&gt;");<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;// conver the final links to a string and assign to labels<br />
&nbsp;&nbsp;&nbsp;return sbPager.ToString();<br />
&nbsp;&nbsp;}</font></p>
<p><br />
lilPage是一个literal，直接调用上面那个方法赋值就可以。</p>
<p><font face="Verdana">private void BindRepeater()<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;DataSet ds = new DataSet();<br />
</font><font face="Verdana"><br />
&nbsp;&nbsp;&nbsp;&nbsp;ds = ......</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;DataTable dt = ds.Tables[0];<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;foreach (DataRow dr in dt.Rows)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (dr["RewardImageUrl"]==null||dr["RewardImageUrl"].ToString().Length ==0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dr["RewardImageUrl"] = ConfigVar.Get("NO_PIC").ToString();<br />
&nbsp;&nbsp;&nbsp;}</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;PagedDataSource pagedDataSource = new PagedDataSource();<br />
&nbsp;&nbsp;&nbsp;pagedDataSource.DataSource = ds.Tables[0].DefaultView; <br />
&nbsp;&nbsp;&nbsp;pagedDataSource.AllowPaging = true;<br />
&nbsp;&nbsp;&nbsp;pagedDataSource.PageSize = int.Parse(giftPageSize);</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;//start paging<br />
&nbsp;&nbsp;&nbsp;if (GetPage() &gt; -1)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;// subtract 1 because the PagedDataSource uses a zero-based index<br />
&nbsp;&nbsp;&nbsp;&nbsp;int pageIndex = GetPage() - 1 ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;// correct for a page index less than 0 or greater than the last page<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (pageIndex &lt; 0) pageIndex = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (pageIndex &gt; pagedDataSource.PageCount) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pageIndex = pagedDataSource.PageCount - 1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;pagedDataSource.CurrentPageIndex = pageIndex;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;this.RepGiftList.DataSource = pagedDataSource;<br />
&nbsp;&nbsp;&nbsp;this.RepGiftList.DataBind();</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;lilPage.Text = CreatePagerLinks(pagedDataSource, GetAbsolutUri());<br />
&nbsp;&nbsp;}</font></p>
 <img src ="http://www.cnblogs.com/beyondjay/aggbug/1224139.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41799/" target="_blank">[新闻]番茄花园作者被警方逮捕</a>]]></description></item><item><title>用httpmodule自动加密解密query string查询字符串</title><link>http://www.cnblogs.com/beyondjay/archive/2008/06/06/1215276.html</link><dc:creator>Tony Zhou</dc:creator><author>Tony Zhou</author><pubDate>Fri, 06 Jun 2008 09:46:00 GMT</pubDate><guid>http://www.cnblogs.com/beyondjay/archive/2008/06/06/1215276.html</guid><wfw:comment>http://www.cnblogs.com/beyondjay/comments/1215276.html</wfw:comment><comments>http://www.cnblogs.com/beyondjay/archive/2008/06/06/1215276.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/beyondjay/comments/commentRss/1215276.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/beyondjay/services/trackbacks/1215276.html</trackback:ping><description><![CDATA[项目中经常遇到query string的加密解密问题，如果在页面或者page base里面处理的话总有点不爽。<br />
所以最近尝试着用httpmodule解决。在网上看到了几篇文章，综合了一下，解决了postback加密过的url丢失的问题。<br />
HttpModule:<br />
#region Using<br />
<br />
using System;<br />
using System.IO;<br />
using System.Web;<br />
using System.Text;<br />
using System.Security.Cryptography;<br />
<br />
#endregion<br />
<br />
/// &lt;summary&gt;<br />
/// Summary description for QueryStringModule<br />
/// &lt;/summary&gt;<br />
public class QueryStringModule : IHttpModule<br />
{<br />
<br />
&nbsp;&nbsp;&nbsp; #region IHttpModule Members<br />
<br />
&nbsp;&nbsp;&nbsp; public void Dispose()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Nothing to dispose<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public void Init(HttpApplication context)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.BeginRequest += new EventHandler(context_BeginRequest);<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; #endregion<br />
<br />
&nbsp;&nbsp;&nbsp; private const string PARAMETER_NAME = "enc=";<br />
&nbsp;&nbsp;&nbsp; private const string ENCRYPTION_KEY = "key";<br />
<br />
&nbsp;&nbsp;&nbsp; void context_BeginRequest(object sender, EventArgs e)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpContext context = HttpContext.Current;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (context.Request.Url.OriginalString.Contains("aspx") &amp;&amp; context.Request.RawUrl.Contains("?"))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string query = ExtractQuery(context.Request.Url.ToString());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string path = GetVirtualPath();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (query.StartsWith(PARAMETER_NAME, StringComparison.OrdinalIgnoreCase))<br />
&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; // Decrypts the query string and rewrites the path.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.Items["OriginalUrl"] = context.Request.Url.ToString();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string rawQuery = query.Replace(PARAMETER_NAME, string.Empty);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string decryptedQuery = Decrypt(rawQuery);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.RewritePath(path, string.Empty, decryptedQuery);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if (context.Request.HttpMethod == "GET")<br />
&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; // Encrypt the query string and redirects to the encrypted URL.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Remove if you don't want all query strings to be encrypted automatically.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string encryptedQuery = Encrypt(query);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.Items["OriginalUrl"] = path + encryptedQuery;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.Response.Redirect(path + encryptedQuery);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;<br />
&nbsp;&nbsp;&nbsp; /// Parses the current URL and extracts the virtual path without query string.<br />
&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;<br />
&nbsp;&nbsp;&nbsp; /// &lt;returns&gt;The virtual path of the current URL.&lt;/returns&gt;<br />
&nbsp;&nbsp;&nbsp; private static string GetVirtualPath()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string path = HttpContext.Current.Request.RawUrl;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; path = path.Substring(0, path.IndexOf("?"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; path = path.Substring(path.LastIndexOf("/") + 1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return path;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;<br />
&nbsp;&nbsp;&nbsp; /// Parses a URL and returns the query string.<br />
&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;<br />
&nbsp;&nbsp;&nbsp; /// &lt;param name="url"&gt;The URL to parse.&lt;/param&gt;<br />
&nbsp;&nbsp;&nbsp; /// &lt;returns&gt;The query string without the question mark.&lt;/returns&gt;<br />
&nbsp;&nbsp;&nbsp; private static string ExtractQuery(string url)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int index = url.IndexOf("?") + 1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return url.Substring(index);<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; #region Encryption/decryption<br />
<br />
&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;<br />
&nbsp;&nbsp;&nbsp; /// The salt value used to strengthen the encryption.<br />
&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;<br />
&nbsp;&nbsp;&nbsp; private readonly static byte[] SALT = Encoding.ASCII.GetBytes(ENCRYPTION_KEY.Length.ToString());<br />
<br />
&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;<br />
&nbsp;&nbsp;&nbsp; /// Encrypts any string using the Rijndael algorithm.<br />
&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;<br />
&nbsp;&nbsp;&nbsp; /// &lt;param name="inputText"&gt;The string to encrypt.&lt;/param&gt;<br />
&nbsp;&nbsp;&nbsp; /// &lt;returns&gt;A Base64 encrypted string.&lt;/returns&gt;<br />
&nbsp;&nbsp;&nbsp; public static string Encrypt(string inputText)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RijndaelManaged rijndaelCipher = new RijndaelManaged();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] plainText = Encoding.Unicode.GetBytes(inputText);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PasswordDeriveBytes SecretKey = new PasswordDeriveBytes(ENCRYPTION_KEY, SALT);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; using (ICryptoTransform encryptor = rijndaelCipher.CreateEncryptor(SecretKey.GetBytes(32), SecretKey.GetBytes(16)))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; using (MemoryStream memoryStream = new MemoryStream())<br />
&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; using (CryptoStream cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write))<br />
&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; cryptoStream.Write(plainText, 0, plainText.Length);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cryptoStream.FlushFinalBlock();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "?" + PARAMETER_NAME + Convert.ToBase64String(memoryStream.ToArray());<br />
&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; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;<br />
&nbsp;&nbsp;&nbsp; /// Decrypts a previously encrypted string.<br />
&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;<br />
&nbsp;&nbsp;&nbsp; /// &lt;param name="inputText"&gt;The encrypted string to decrypt.&lt;/param&gt;<br />
&nbsp;&nbsp;&nbsp; /// &lt;returns&gt;A decrypted string.&lt;/returns&gt;<br />
&nbsp;&nbsp;&nbsp; public static string Decrypt(string inputText)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RijndaelManaged rijndaelCipher = new RijndaelManaged();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] encryptedData = Convert.FromBase64String(inputText);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PasswordDeriveBytes secretKey = new PasswordDeriveBytes(ENCRYPTION_KEY, SALT);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; using (ICryptoTransform decryptor = rijndaelCipher.CreateDecryptor(secretKey.GetBytes(32), secretKey.GetBytes(16)))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; using (MemoryStream memoryStream = new MemoryStream(encryptedData))<br />
&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; using (CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read))<br />
&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; byte[] plainText = new byte[encryptedData.Length];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int decryptedCount = cryptoStream.Read(plainText, 0, plainText.Length);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return Encoding.Unicode.GetString(plainText, 0, decryptedCount);<br />
&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; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; #endregion<br />
<br />
}<br />
<br />
<br />
PageBase:需要继承一下这个pagebase<br />
public class PageBase:Page<br />
&nbsp;&nbsp;&nbsp; {<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected override void OnLoadComplete(EventArgs e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string originalUrl = Context.Items["OriginalUrl"] as string;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!string.IsNullOrEmpty(originalUrl)) //So this page have been urlrewriten, after the page onloaded, rewrite the url of this page to original url<br />
&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; string query = string.Empty;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int pos = originalUrl.IndexOf('?');<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (pos &gt;= 0)// check if has query paramet<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; query = originalUrl.Substring(pos + 1);<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; originalUrl = originalUrl.Substring(0, pos);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Context.RewritePath(QueryStringModule.GetVirtualPath(), string.Empty, query);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; base.OnLoadComplete(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
<br />
参考<br />
http://msdn.microsoft.com/en-us/library/ms972974.aspx<br />
http://www.webpronews.com/expertarticles/2007/01/25/aspnet-httpmodule-for-query-string-encryption<br />
<br />
<img src ="http://www.cnblogs.com/beyondjay/aggbug/1215276.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41792/" target="_blank">[新闻]WordPress和Movable Type影响社交网站的未来</a>]]></description></item><item><title>NETWORK SERVICE错误</title><link>http://www.cnblogs.com/beyondjay/archive/2008/04/26/1172249.html</link><dc:creator>Tony Zhou</dc:creator><author>Tony Zhou</author><pubDate>Sat, 26 Apr 2008 08:12:00 GMT</pubDate><guid>http://www.cnblogs.com/beyondjay/archive/2008/04/26/1172249.html</guid><wfw:comment>http://www.cnblogs.com/beyondjay/comments/1172249.html</wfw:comment><comments>http://www.cnblogs.com/beyondjay/archive/2008/04/26/1172249.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/beyondjay/comments/commentRss/1172249.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/beyondjay/services/trackbacks/1172249.html</trackback:ping><description><![CDATA[<span><span style="color: #993300"><span style="font-size: 8pt; color: black; font-family: 新宋体">
<p><span style="font-size: 12pt">启动时出现一个矩形框:</span></p>
<p><span style="font-size: 12pt">&#8220;至少一个服务或应用程序错误&#8221;</span></p>
<p><span style="font-size: 12pt">解决的方法：</span></p>
<p><span style="font-size: 12pt">1. （点击打开）&#8220;开始&#8221;\&#8220;管理工具&#8221;\&#8220;事件查看器&#8221;\（&#8220;应用程序&#8221;/&#8220;安全&#8221;/&#8220;系统&#8221;中寻找并右击错误行）\&#8220;事件详细信息——描述&#8221;，（如显示：&#8220;来源：DCOM&nbsp;&nbsp;&nbsp; 事件：10016&nbsp;&nbsp; 用户：NETWORK SERVICE　应用程序-特定 权限设置未将COM 服务器应用程序(CLSID 为{BA126AD1-2166-11D1-B1D0-00805FC1270E})的本地激活权限授予用户 NT AUTHORITY\NETWORK SERVICE SID (S- 1-5-20)。&#8221;，则明白这是错误所在）\（点击关闭。）</span></p>
<p><span style="font-size: 12pt">&nbsp;&nbsp; </span></p>
<p><span style="font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2. （点击打开）&#8220;开始&#8221;／&#8220;控制面板&#8221;／&#8220;管理工具&#8221;／&#8220;组件服务&#8221;。</span></p>
<p><span style="font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p><span style="font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp; 3. 打开树目录&#8220;计算机&#8221;／&#8220;我的电脑&#8221;／&#8220;DCOM配置&#8221;／右击&#8220;netman&#8221; ／ &#8220;属性&#8221;／&#8220;安全&#8221;／&#8220;启动和激活权限&#8221; ／&#8220;自定义&#8221;-&#8220;编辑&#8221;／&#8220;添加-&#8216; NETWORK SERVICE &#8217;&#8221; ／&#8220;确定&#8221;／&#8220;&#8216;本地启动-允许&#8217;；&#8216;本地激活-允许&#8217;&#8221; ／&#8220;确定&#8221;／&#8220;应用&#8221;／&#8220;确定&#8221;（完成）。</span></p>
<p><font face="Verdana"></font>&nbsp;</p>
</span></span></span>
<img src ="http://www.cnblogs.com/beyondjay/aggbug/1172249.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41791/" target="_blank">[新闻]谷歌平台手机获准上市</a>]]></description></item><item><title>Command模式</title><link>http://www.cnblogs.com/beyondjay/archive/2008/03/25/1121379.html</link><dc:creator>Tony Zhou</dc:creator><author>Tony Zhou</author><pubDate>Tue, 25 Mar 2008 07:40:00 GMT</pubDate><guid>http://www.cnblogs.com/beyondjay/archive/2008/03/25/1121379.html</guid><wfw:comment>http://www.cnblogs.com/beyondjay/comments/1121379.html</wfw:comment><comments>http://www.cnblogs.com/beyondjay/archive/2008/03/25/1121379.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/beyondjay/comments/commentRss/1121379.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/beyondjay/services/trackbacks/1121379.html</trackback:ping><description><![CDATA[using System;<br />
using System.Collections;<br />
using System.Configuration;<br />
using System.Data;<br />
using System.Linq;<br />
using System.Web;<br />
using System.Web.Security;<br />
using System.Web.UI;<br />
using System.Web.UI.HtmlControls;<br />
using System.Web.UI.WebControls;<br />
using System.Web.UI.WebControls.WebParts;<br />
using System.Xml.Linq;<br />
<br />
public partial class Design_Pattern_Command : System.Web.UI.Page<br />
{<br />
&nbsp;&nbsp;&nbsp; protected void Page_Load(object sender, EventArgs e)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Controller controller = new Controller();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Hello hello = new Hello();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HelloCommand helloCommand = new HelloCommand(hello);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; controller.SetCommand(0, helloCommand);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Bye bye = new Bye();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ByeCommand byeCommand = new ByeCommand(bye);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; controller.SetCommand(1, byeCommand);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Good good = new Good();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GoodCommand goodCommand = new GoodCommand(good);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; controller.SetCommand(2, goodCommand);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; controller.OnPush(2);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; controller.OnPush(0);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; controller.OnPush(1);<br />
<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
<br />
public class Hello<br />
{<br />
&nbsp;&nbsp;&nbsp; public void SayHello()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Web.HttpContext.Current.Response.Write("Hello!");<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
<br />
public class Bye<br />
{<br />
&nbsp;&nbsp;&nbsp; public void SayBye()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Web.HttpContext.Current.Response.Write("Bye!");<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
<br />
public class Good<br />
{<br />
&nbsp;&nbsp;&nbsp; public void SayGood()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Web.HttpContext.Current.Response.Write("Good!");<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
<br />
public interface ICommand<br />
{<br />
&nbsp;&nbsp;&nbsp; void Execute();<br />
}<br />
<br />
public class HelloCommand : ICommand<br />
{<br />
&nbsp;&nbsp;&nbsp; private Hello _hello;<br />
<br />
&nbsp;&nbsp;&nbsp; public HelloCommand(Hello hello)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this._hello = hello;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public void Execute()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this._hello.SayHello();<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
<br />
public class ByeCommand : ICommand<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp; private Bye _bye;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; public ByeCommand(Bye bye)<br />
&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this._bye = bye;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public void Execute()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this._bye.SayBye();<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
<br />
public class GoodCommand : ICommand<br />
{<br />
&nbsp;&nbsp;&nbsp; private Good _good;<br />
<br />
&nbsp;&nbsp;&nbsp; public GoodCommand(Good good)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this._good = good;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public void Execute()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this._good.SayGood();<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
<br />
public class Controller<br />
{<br />
&nbsp;&nbsp;&nbsp; ICommand[] commands = new ICommand[3];<br />
<br />
&nbsp;&nbsp;&nbsp; public void SetCommand(int slot, ICommand command)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; commands[slot] = command;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public void OnPush(int slot)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; commands[slot].Execute();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
}<br />
<img src ="http://www.cnblogs.com/beyondjay/aggbug/1121379.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41790/" target="_blank">[新闻]微软自称传媒公司 强调搜索引擎三大趋势</a>]]></description></item><item><title>Decorator模式</title><link>http://www.cnblogs.com/beyondjay/archive/2008/03/03/1088716.html</link><dc:creator>Tony Zhou</dc:creator><author>Tony Zhou</author><pubDate>Mon, 03 Mar 2008 05:46:00 GMT</pubDate><guid>http://www.cnblogs.com/beyondjay/archive/2008/03/03/1088716.html</guid><wfw:comment>http://www.cnblogs.com/beyondjay/comments/1088716.html</wfw:comment><comments>http://www.cnblogs.com/beyondjay/archive/2008/03/03/1088716.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/beyondjay/comments/commentRss/1088716.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/beyondjay/services/trackbacks/1088716.html</trackback:ping><description><![CDATA[<font face="Verdana">
<p>根据《Head Of Design Pattern》里面的Java代码改写的Decorator模式</p>
<p>using System;<br />
using System.Collections;<br />
using System.Configuration;<br />
using System.Data;<br />
using System.Linq;<br />
using System.Web;<br />
using System.Web.Security;<br />
using System.Web.UI;<br />
using System.Web.UI.HtmlControls;<br />
using System.Web.UI.WebControls;<br />
using System.Web.UI.WebControls.WebParts;<br />
using System.Xml.Linq;</font></p>
<p><font face="Verdana">public partial class Design_Pattern_Decorator : System.Web.UI.Page<br />
{<br />
&nbsp;&nbsp;&nbsp; protected void Page_Load(object sender, EventArgs e)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Beverage beverage1 = new Espresso();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; beverage1 = new Mocha(beverage1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; beverage1 = new Sugar(beverage1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.Write(beverage1.cost());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.Write(beverage1.GetDescription());<br />
&nbsp;&nbsp;&nbsp; }<br />
}</font></p>
<p><font face="Verdana">public abstract class Beverage<br />
{<br />
&nbsp;&nbsp;&nbsp; protected string description = "Unknown Beverage";</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; public virtual string GetDescription()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return description;<br />
&nbsp;&nbsp;&nbsp; }</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; public abstract double cost();<br />
}</font></p>
<p><font face="Verdana">public class Espresso : Beverage<br />
{<br />
&nbsp;&nbsp;&nbsp; public Espresso()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.description = "Espresso";<br />
&nbsp;&nbsp;&nbsp; }</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; public override double cost()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 1.99;<br />
&nbsp;&nbsp;&nbsp; }<br />
}</font></p>
<p><font face="Verdana">public class HouseBlend : Beverage<br />
{<br />
&nbsp;&nbsp;&nbsp; public HouseBlend()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.description = "House Blend";<br />
&nbsp;&nbsp;&nbsp; }</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; public override double cost()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0.89;<br />
&nbsp;&nbsp;&nbsp; }<br />
}</font></p>
<p><font face="Verdana">public abstract class CondimentDecorator : Beverage<br />
{<br />
&nbsp;&nbsp; public override abstract string GetDescription();<br />
}</font></p>
<p><font face="Verdana">public class Mocha : CondimentDecorator<br />
{<br />
&nbsp;&nbsp;&nbsp; Beverage beverage;</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; public Mocha(Beverage beverage)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.beverage = beverage;<br />
&nbsp;&nbsp;&nbsp; }</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; public override string GetDescription()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.description = beverage.GetDescription() + ", Mocha";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.description;<br />
&nbsp;&nbsp;&nbsp; }</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; public override double cost()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return beverage.cost() + 0.2;<br />
&nbsp;&nbsp;&nbsp; }<br />
}</font></p>
<p><font face="Verdana">public class Sugar : CondimentDecorator<br />
{<br />
&nbsp;&nbsp;&nbsp; Beverage beverage;</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; public Sugar(Beverage beverage)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.beverage = beverage;<br />
&nbsp;&nbsp;&nbsp; }</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; public override string GetDescription()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return beverage.GetDescription() + ", Sugar";<br />
&nbsp;&nbsp;&nbsp; }</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; public override double cost()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return beverage.cost() + 0.12;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
}</font></p>
<p><font face="Verdana"></font>&nbsp;</p>
<img src ="http://www.cnblogs.com/beyondjay/aggbug/1088716.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41789/" target="_blank">[新闻]亚洲社交网站Friendster将兼容竞争对手窗件</a>]]></description></item></channel></rss>