<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title><![CDATA[设计碎片 - .Net]]></title>
<link>http://blog.edotpower.com/</link>
<description><![CDATA[网络那么乱，可我还得拼...]]></description>
<language>zh-cn</language>
<copyright><![CDATA[Copyright 2005 PBlog2 v2.4]]></copyright>
<webMaster><![CDATA[star520dust@163.com(Hsure)]]></webMaster>
<generator>PBlog2 v2.4</generator> 
<image>
	<title>设计碎片</title> 
	<url>http://blog.edotpower.com/images/logos.gif</url> 
	<link>http://blog.edotpower.com/</link> 
	<description>设计碎片</description> 
</image>

			<item>
			<link>http://blog.edotpower.com/default.asp?id=144</link>
			<title><![CDATA[分享.NET开发中经常用到的十大软件]]></title>
			<author>star520dust@163.com(stardust)</author>
			<category><![CDATA[.Net]]></category>
			<pubDate>Mon,16 Feb 2009 01:17:07 +0800</pubDate>
			<guid>http://blog.edotpower.com/default.asp?id=144</guid>	
		<description><![CDATA[1. EditPlus(http://www.editplus.com/)：文字处理软件<br /><br /><br />EditPlus 是一款功能强大的文字处理软件。它可以充分的替换记事本，它也提供网页作家及程序设计师许多强悍的功能。支持 HTML、CSS、PHP、ASP、Perl、C/C++、Java、JavaScript、VBScript 等多种语法的着色显示。程序内嵌网页浏览器，其它功能还包含 FTP 功能、HTML 编辑、URL 突显、自动完成、剪贴文本、行列选择、强大的搜索与替换、多重撤销/重做、拼写检查、自定义快捷键。<br /><br />2. NotePad2(http://www.flos-freeware.ch/notepad2.html)：文字处理软件<br /><br />自定义语法高亮，支持HTML, XML, CSS, JavaScript, VBScript, ASP,PHP, CSS, Perl/CGI,C/C++, C#, Java, VB, Pascal, 汇编, SQL, Python, NSIS,INI, REG, INF, BAT,DIFF等众多脚本文件。支持ANSI，Unicode，UTF-8等编码互换。可以设置无限个书签（9种图标可换）轻松定位。 空格，制表符彩色显示，并可互相转换。可以对任意的文本块进行操作，ALT键＋鼠标。对括号｛｝〔〕（）可以高亮配对显示，方便查看(仅对英文符号有效)。可以自定义代码页和字符集，对中文支持良好。使用标准的正则表达式搜索和替换。可以使用半透明模式，cool。快速放大、缩小页面，不用再设定字体大小。可以指定ESC键最小化Notepad2到系统托盘或者关闭Notepad2 <br /><br />3. FastStone Screen Capture(http://www.faststone.org)：截图软件<br /><br /><br />FastStone Screen Capture (FSCapture) 是一款免费的图像浏览、编辑和抓屏工具，支持包括BMP, JPEG, JPEG 2000, GIF, PNG, PCX, TIFF, WMF, ICO 和TGA在内的所有主流图片格式，其独有的光滑和毛刺处理技术让图片更加清晰，提供缩放、旋转、减切、颜色调整功能。只要点点鼠标就能随心抓取屏幕上的任何东西，拖放支持可以直接从系统、浏览器或其他程序中导入图片，收藏夹功能让你能更好的从eNet收集更多精彩图片。<br /><br />4. Beyond Compare(http://www.scootersoftware.com/download.php)：文件比较软件<br /><br />Beyond Compare 是一款优秀的文件及文件夹对比工具，程序内建了文件浏览器，方便您针对文件、文件夹、压缩包、FTP网站之间的差异对比及资料同步。<br /><br />5. Dependency Walker(http://www.dependencywalker.com/)：在实际应用中，我常常利用该软件判断系统中少了哪些必要的DLL组件。<br /><br />Dependency Walker 是 Microsoft Visual C++ 中提供的非常有用的 PE 模块依赖性分析工具。主要功能如下：查看 PE 模块的导入模块；查看 PE 模块的导入和导出函数；动态剖析 PE 模块的模块依赖性；解析 C++ 函数名称。 <br /><br /><br />6. .NET Reflector(http://www.red-gate.com/products/reflector/)：反编译器<br /><br />.NET Reflector是一个类浏览器和反编译器，利用反射机制来分析程序集，以展示程序集中各种类型及其成员的信息。 <br /><br /><br />7. Snippet Compiler(http://www.sliver.com/dotnet/SnippetCompiler/)；<br /><br />Snippet Compiler 是一个基于 Windows的小型应用程序，您可以通过它来编写、编译和运行代码。如果您具有较小的代码段，并且您不希望为其创建完整的 Visual Studio .NET 项目（以及伴随该项目的所有文件），则该工具将很有用。 <br /><br />8. SQL Delta(http://www.sqldelta.com/)：数据库同步工具。虽说VS2008也有同样的功能，但用惯了SQL Delta，就基本没有使用VS2008自带的数据库同步功能了。<br /><br /><br />SQL Delta结合了数据库的结构比较和数据比较功能，使得SQL Delta成为市场上最有价值的数据库比较工具。现在只需点几下鼠标，就可以同步数据库的概要和数据，而且不需要运行Query Analyser来检查结果。SQL Delta也为数据库带来了更容易阅读的表格，能快速统计区别。通过减少在大型文件中查找变量带来的卷动需求使得操作变得简单。 <br /><br /><br />9. SyncToy(http://www.microsoft.com/downloads/details.aspx?FamilyId=E0FC1154-C975-4814-9649-CCE41AF06EB7&amp;displaylang=en)：文件同步工具<br /><br /><br />它可以让您的文件在不同的磁盘和文件夹中保持同步并且可以随意处理，甚至可以输入UNC以处理网络驱动器上的文件和任何设备上的信息。<br /><br />10. IE Developer Tool Bar &amp; Firefox + Firebug：脚本调试工具、DOM浏览工具等等，应该是每个搞WEB的必备工具。PS:IE8中内置的IE Developer Tool Bar功能和之前的版本比较，有显著的提高，但还是略显不足啊。<br /><br /><br />本文来源：- Jailu.NET - 博客园]]></description>
		</item>
		
			<item>
			<link>http://blog.edotpower.com/default.asp?id=143</link>
			<title><![CDATA[使用UrlRewriter进行Url重写的完整解决方案]]></title>
			<author>star520dust@163.com(stardust)</author>
			<category><![CDATA[.Net]]></category>
			<pubDate>Sat,14 Feb 2009 19:33:01 +0800</pubDate>
			<guid>http://blog.edotpower.com/default.asp?id=143</guid>	
		<description><![CDATA[<p>Setp 1: <br />下载UrlRewriter =&gt; <a href="http://urlrewriter.net/">http://urlrewriter.net/</a> <br />Setp 2: <br />将其添加到Web项目的Bin目录下</p>
<p>Setp 3: <br />配置：打开web.config，在configSecions中添加sectionHandler:</p>
<p>&lt;section name=&quot;rewriter&quot; requirePermission=&quot;false&quot; type=&quot;Intelligencia.UrlRewriter.Configuration.<br />RewriterConfigurationSectionHandler, Intelligencia.UrlRewriter&quot; /&gt;<br />添加这个section是为了它能够处理web.config中的节；然后对UrlRewriter配置url重写规则：</p>
<p>&lt;rewriter&gt;<br />&nbsp;&nbsp;&nbsp; &lt;rewrite url=&rdquo;~/lmh$&rdquo; to=&rdquo;~/Users.aspx?user=lmh&rdquo; processing=&rdquo;stop&rdquo; /&gt;<br />&lt;/rewriter&gt;<br />url是可以使用正则表达式的。比如上面的例子，就是将<a href="http://www.***.net/lmh">http://www.***.net/lmh</a>重写到<a href="http://www.***.net/Users.aspx?user=lmh">http://www.***.net/Users.aspx?user=lmh</a>，$在正则表达式中表示是串的结束，也就是说<a href="http://www.***.net/lmhe">http://www.***.net/lmhe</a>是不会被重写到to后的地址的，如果把$去掉则可以。</p>
<p>Setp 4: <br />使rewriter生效：UrlRewriter是在HttpModule中做url重写的，要使重写生效，就得先把HttpModule添加到web.config中：</p>
<p>&lt;httpModules&gt;<br />&nbsp;&nbsp;&nbsp; &lt;add name=&quot;UrlRewriter&quot; type=&quot;Intelligencia.UrlRewriter.RewriterHttpModule, Intelligencia.UrlRewriter&quot;/&gt;<br />&lt;/httpModules&gt;<br />Setp 5: <br />让ReWriter有机会重写Url: 当iis收到一个请求时，并不是都会扔给asp.net(aspnet_isapi.dll)来处理，比如静态html，默认情况下，当请求html页面时，iis直接就把结果抛给了客户端，之所以.aspx页面会被asp.net引擎处理，是因为在iis有进行处理程序映射，.aspx被映射到aspnet_isapi.dll，所以当iis收到请求时，先看后缀名，如果是aspx，那就把它交给aspnet_isapi.dll来处理。因为UrlRewriter是asp.net级别的重写组件，所以，假如要想执行setp3中例子那样的重写，得先让UrlRewriter有机会收到这个地址的请求才行（默认UrlRewriter是没机会处理这个url的，因为iis收到这个地址的请求时，因为它没有映射到aspnet_isapi.dll，所以会直接抛出404找不到的错误，因此，要替它做这个映射。打开iis，在属性中有这一项，我们可以让*映射到aspnet_isapi.dll，这样所有的文件都交给asp.net来处理了，UrlRewriter也就有机会出手了。 </p>
<p>如果用的是IIS7.0，则不用这么麻烦，整个Setp4可以简化为：在web.config中的节的节中添加上UrlRewriter:</p>
<p>&lt;add name=&quot;UrlRewriter&quot; type=&quot;Intelligencia.UrlRewriter.RewriterHttpModule, Intelligencia.UrlRewriter&quot;/&gt;<br />这会保证所有的请求都会经过asp.net的这个Module。</p>
<p>现在，重写就算基本完成了，但有几个问题：</p>
<p>Problem 1:<br />&nbsp;图片可能不显示：如果进行Url Rewirte并且页面中的图片引用是使用相对路径的话，很可能会发现图片无效了，这是因为，假如/Users/lmh会被重写为/Users.aspx?user=lmh，而Users.aspx上有一张图片，放在相同目录下：logo.gif，(Users.aspx中是&lt;img src='logo.gif' /&gt;)那当请求/Users/lmh时，浏览器对logo.gif的请求的路径将变成/Users/logo.gif，而实际上logo.gif是要用/logo.gif才能请求得到的，所以，为了保证Url rewrite后不会出现这个问题，需要使用&lt;img src='/logo.gif' /&gt;，但是当使用UrlRewriter时，对于Css，如果代码中是，而实际用Users/lmh去请求的话，会发现其实已经变成了，而图片，如果是用的服务器控件的话，也可以继续使用相对路径，就不存在标题中的问题。</p>
<p>Problem 2: <br />Asp.net的postback会导致真实地址又被嚗光：还是setp3的例子，假设Users.aspx中有一个服务器按钮控件，当第一次请求时，确实OK，但是一旦点击了那个按钮，地址栏又变成了<a href="http://www.***.net/Users.aspx?user=lmh">http://www.***.net/Users.aspx?user=lmh</a>，原因是asp.net的服务器form控件的action默认都是指定当前页面地址的，虽然我们收到的请求是&hellip;/lmh，但经过UrlRewrite后，asp.net处理的已经是真实的地址：&hellip;/Users.aspx?user=lmh，所以在form被Render时，action会是../Users.aspx?user=lmh，那么，要解决这个问题，就是让form的action的值也被render为请求的地址，这个网上已经有答案了，就是利用ControlAdapter（写在App_Code中即可，不过为了重用，可以放到类库项目中）：</p>
<p>FormRewriterControlAdapter<br />&nbsp;1&nbsp;&nbsp;&nbsp; public class FormRewriterControlAdapter : System.Web.UI.Adapters.ControlAdapter<br />&nbsp;2&nbsp;&nbsp;&nbsp; {<br />&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected override void Render(HtmlTextWriter writer)<br />&nbsp;4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; base.Render(new RewriteFormHtmlTextWriter(writer));<br />&nbsp;6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;7&nbsp;&nbsp;&nbsp; }<br />&nbsp;8 <br />&nbsp;9&nbsp;&nbsp;&nbsp; public class RewriteFormHtmlTextWriter : HtmlTextWriter<br />10&nbsp;&nbsp;&nbsp; {<br />11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public RewriteFormHtmlTextWriter(HtmlTextWriter writer)<br />12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : base(writer)<br />13&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.InnerWriter = writer.InnerWriter;<br />15&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />16 <br />17&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public override void WriteAttribute(string name, string value, bool fEncode)<br />18&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />19&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (name == &quot;action&quot;)<br />20&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />21&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpContext context = HttpContext.Current;<br />22 <br />23&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value = context.Request.RawUrl;<br />24&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />25&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; base.WriteAttribute(name, value, fEncode);<br />26&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />27&nbsp;&nbsp;&nbsp; }<br />这段代码是来自Jeffery Zhao的博客文章（我去掉了其中一些代码，只保留了保证会工作的最基本代码）。</p>
<p>需要说明的一点是：HtmlTextWriter有两个WriteAttribute方法：</p>
<p>public virtual void WriteAttribute(string name, string value, bool fEncode)</p>
<p>public virtual void WriteAttribute(string name, string value)</p>
<p>&nbsp;</p>
<p>重写下面的那个WriteAttribute是不能成功的，必须重写上面那个方法。为什么呢？先调试看看。</p>
<p>会发现如果重写的是上面那个方法，则会有一次传进来的name值是&quot;action&quot;，如我所愿，而重写下面那个方法则没发现传进来值是&rdquo;action&rdquo;的name参数。这是怎么搞的？ </p>
<p>首先我们要知道，下面那个方法其实是简单的调用了上面的WriteAttribute : </p>
<p>public virtual void WriteAttribute(string name, string value) { </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WriteAttribute(name, value, false /*encode*/);</p>
<p>}</p>
<p>这是framework中的源码。那么，我们所可以猜测到的，就是action这个属性不是通过调用WriteAttribute(&ldquo;action&rdquo;, &ldquo;&hellip;&rdquo;)来渲染的，而是直接调用WrtiteAttribute(&ldquo;action&rdquo;, &ldquo;&hellip;&rdquo;, &hellip;)，那我们就打开HtmlForm的源代码看看吧（没有源代码的可以用Reflector看），找到HtmlForm.RenderAttributes(HtmlTextWrtier writer)方法，其中有几行： </p>
<p>writer.WriteAttribute(&quot;method&quot;, Method);</p>
<p>Attributes.Remove(&quot;method&quot;); </p>
<p>// Encode the action attribute - ASURT 66784 </p>
<p>writer.WriteAttribute(&quot;action&quot;, GetActionAttribute(), true /*encode*/); </p>
<p>Attributes.Remove(&quot;action&quot;);</p>
<p>我们重点看的是上面加粗并下划线的那两行，可以很清楚的看到，当渲染&rdquo;method&rdquo;属性时，只是调用了</p>
<p>public virtual void WriteAttribute(string name, string value)</p>
<p>而渲染action属性则是调用了</p>
<p>public virtual void WriteAttribute(string name, string value, bool fEncode)</p>
<p>那么，答案也就浮出水面了。</p>
<p>接下来，我们要让这个Adapter起作用（上面之所以可以调试，是因为我已经让其起作用了，只是还没写出来）。添加Asp.net Folder：App_Browses，新建一个browser文件：</p>
<p><br />&lt;browsers&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;browser refID=&quot;Default&quot;&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;controlAdapters&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;adapter controlType=&quot;System.Web.UI.HtmlControls.HtmlForm&quot;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; adapterType=&quot;FormRewriterControlAdapter&quot;/&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/controlAdapters&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;/browser&gt;</p>
<p>&lt;/browsers&gt;</p>
<p>因为上面的FormRewriterControlAdapter是写在App_Code中的，所以不需要添加命名空间。</p>
<p>这么一来，使用UrlRewriter进行asp.net级别的UrlRewrite就弄好了。</p>
<p><br />本篇文章来源于 <a href="http://www.shenjk.com">www.shenjk.com</a> 原文链接：<a href="http://www.shenjk.com/details/377.html">http://www.shenjk.com/details/377.html</a></p>]]></description>
		</item>
		
			<item>
			<link>http://blog.edotpower.com/default.asp?id=142</link>
			<title><![CDATA[.NET中Cache的使用]]></title>
			<author>star520dust@163.com(stardust)</author>
			<category><![CDATA[.Net]]></category>
			<pubDate>Sat,14 Feb 2009 17:00:05 +0800</pubDate>
			<guid>http://blog.edotpower.com/default.asp?id=142</guid>	
		<description><![CDATA[来源：丘亮的空间 - 博客园<br />　　Cache 即高速缓存 ，我想很多人对他的第一印象一定像我一样，感觉他一定能提高系统得性能和运行速度。的确.Net推出cache的初衷确实是这样的。那么cache是如何提高系统性能与运行速度呢？是不是在任何情况下用cache都能提高性能？是不是cache用的越多就越好呢？我在近期开发的项目中有所体会，写下来当作总结也希望能跟大家一起探讨探讨，有错误的地方希望大家批评指正。<br /><br />　　1. Cache 是如何工作的。<br />　　l Cache 是分配在服务器上的一个公共的内存片。<br />　　所谓公共指的cache只要一创建是任何一个客户端浏览器都可以通过后台代码访问到它，它面向的是所有用户，相对而言session也是服务器上的一段内存，但他面向的是单个用户。它是服务器的一段内存块，也就是说每个cache一经创建就占用了服务器资源的。所以从这点来说我们就可以说：并不是cache越多越好。<br /><br />　　l cache 是有时间限制的，超过了服务器设定的过期时间，它就会被服务器回收。<br />　　l c.cache 可以存放任何对象<br />　　2. Cache 如何创建以及如何销毁。<br />　　l 创建cache<br />　　在.Net环境下通过Cache.Insert(string key,object o)方法创建。其中key 代表cache的ID,o代表存到cache里的对象。<br /><br />　　l 销毁cache.<br />　　通过方法Cache.Remove(string key)其中key 代表cache的 ID.<br /><br />　　l 调用cache.<br />　　Cache支持装箱/拆箱操作。如你可以把一个DataSet对象ds通过Cache.Insert(&ldquo;dsCache&rdquo;,ds)的方式存到Cache中，可以通过拆箱操作 DataSet ds = (DataSet)Cache[&ldquo;dsCache&rdquo;]来访问它。<br /><br />　　3. 什么时候用cache.<br />　　Cache 一般用于数据较固定，用的较频繁的地方。例如可以把进销存系统中可以把产品信息存入cache,在用户调用产品信息时通过调用cache即可，这样从很大程度上减少了用户与数据库的交互，提高了系统的性能。反之，cache不适合用在数据变动快，使用范围很窄的地方。例如把一个具体采购单存入 cache中。<br /><br />　　4. cache 调用注意事项。<br />　　Cache是有时间限制的。超过了服务器设置的过期时间，就会被服务器回收。当cache被回收后对应的内存块就会被清空，再次通过cache[&ldquo;cachekey&rdquo;]访问对象时返回的就是null值。所以以下这种调用就会出现异常<br />DataSet ds = (DataSet)Cache[&ldquo;cacheds&rdquo;]; <br />DataRow dr = ds.Table[0].Row[0]; //出错，ds为null值，不存在表0。<br />　　正确的写法应该是：<br />DataSet ds<br />If(Cache[&ldquo;cacheds&rdquo;] != null)<br />{<br />ds = (DataSet)Cache[&ldquo;cacheds&rdquo;]; <br />}<br /><br />Else<br />{<br />ds= GetDsFromDataBase(); <br />}<br />DataRow dr = ds.Table[0].Row[0];]]></description>
		</item>
		
			<item>
			<link>http://blog.edotpower.com/default.asp?id=141</link>
			<title><![CDATA[[转] ASP.NET2.0缓存(Cache)技术]]></title>
			<author>star520dust@163.com(stardust)</author>
			<category><![CDATA[.Net]]></category>
			<pubDate>Sat,14 Feb 2009 16:51:35 +0800</pubDate>
			<guid>http://blog.edotpower.com/default.asp?id=141</guid>	
		<description><![CDATA[<span style="COLOR: #000000">ASP.NET&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">.0提供了一些新的用于提升程序性能的技术特性，其中，缓存技术是非常重要的一个特性，它提供了一种非常好的本地数据缓存机制，从而有效的提高数据访问的性能。&nbsp;<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />数据缓存(Data&nbsp;Caching)就是将数据暂存于内存缓存区中(有时也暂存于硬盘缓存区中)的一种技术.当数据本身改变得不怎么频繁,而被访问的频率又比较高时,采用这种技术将大大提高警惕数据访问的效率.<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">.网页输出缓存<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)加显缓存<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="COLOR: #000000">&lt;%</span><span style="COLOR: #000000">@&nbsp;OutputCache&nbsp;Duration</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">60</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">&nbsp;VaryByParam</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">none</span><span style="COLOR: #000000">%&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />语句</span><span style="COLOR: #000000">&lt;%</span><span style="COLOR: #000000">@<img src="http://www.cnblogs.com/Images/dot.gif" alt="" /></span><span style="COLOR: #000000">%&gt;</span><span style="COLOR: #000000">是网页配置的指令,在这里用来给网页指定缓存参数.其中:Duration</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">60</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">代表缓存持续时间为60秒,VaryByParam属性用来指定特定版本的网页输出,因哪个参数而改变.在</span><span style="COLOR: #000000">&lt;%</span><span style="COLOR: #000000">@OutputCache<img src="http://www.cnblogs.com/Images/dot.gif" alt="" /></span><span style="COLOR: #000000">%&gt;</span><span style="COLOR: #000000">配置指令中一定要加入VaryByParam属性.即使不使用这个版本属性,也要将它加入,但将其值设为none.<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">.&nbsp;回调缓存<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="COLOR: #000000">&lt;%</span><span style="COLOR: #000000">@&nbsp;OutputCache&nbsp;Duration</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">60</span><span style="COLOR: #000000">&nbsp;VaryByParam</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">stata&nbsp;</span><span style="COLOR: #000000">%&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />根据&nbsp;lll.aspx</span><span style="COLOR: #000000">?</span><span style="COLOR: #000000">stata</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">的内容分别缓存<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />&nbsp;下面的方法可以根据内容刷新<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">script&nbsp;runat</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">server</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;Shared&nbsp;Function&nbsp;GetCurrentDate(ByVal&nbsp;context&nbsp;As&nbsp;HttpContext)&nbsp;As&nbsp;String<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Return&nbsp;Now.ToString()<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;End&nbsp;Function<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">script</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">asp:Substitution&nbsp;ID</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">Substitution1</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">&nbsp;runat</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">server</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">&nbsp;MethodName</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">GetCurrentDate</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">.数据库缓存<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />在ASP.NET2.0中可以通过数据源设置数据表的缓存参数.在SqlDataSource控件的属性中有几项用于设置缓存的参数.<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />CacheDuration:代表缓存的持续时间.默认为Infinite(无限)<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />CacheExpirationPolicy:缓存的策略.包括两种设置:Absolute和Sliding.当设置成前者时,时限一到缓存区失效;当设置为后者时,时限到立即刷新缓存区中的数据,并继续缓存更新后的数据.<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />CacheKeyDependency:可以用于SQL&nbsp;Server2005数据库.<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />EnableCaching:默认时为False,即不使用数据缓存,将该属性改为True时即可启动数据缓存.<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />SqlCacheDependecy:缓存依赖关系.例如设置为pubs:authors表示数据库Pubs中的authors数据表与它的数据缓存之间建立依赖关系.<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />有时数据表太大,缓存区可能会占用太大的内存空间.可以将数据缓存到硬盘的缓存区中,为了实现&nbsp;这一点,需要做一些专门的设置.设置包括两方面.<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />一:在网页中配置</span><span style="COLOR: #000000">&lt;%</span><span style="COLOR: #000000">@OutputCache&nbsp;Duration</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">3600</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">&nbsp;VaryByParam</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">none</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">&nbsp;DiskCacheable</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">true</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">%&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />二:在Web.config文件中指定硬盘缓区区的大小,配置的语句如下:<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">system.web</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">caching</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">outputCache</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">diskCache&nbsp;Enabled</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">true</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">&nbsp;maxSizePerApp</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">outputCache</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">caching</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">system.web</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />其中diskCache&nbsp;Enabled</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">true</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">&nbsp;用来启动硬盘缓存功能;maxSizePerApp</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">用来确定缓存区的容量,这里确定的缓存区最大容量为2M.同于对硬盘的存取速度比较慢,因此硬盘缓存只适用于缓存持续时间较长的情况(本例中缓存时间为1小时).<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">.缓存池<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />数据缓存技术大大提高警惕了数据访问的速度,但却可能引发数据不一致的问题.因此以上缓存技术只适用于数据量大,变化频率不高的数据.现在ASP.NET2.0新版本结合数据库SQL&nbsp;Server2005,对数据缓存功能又做了很大的改进,既简化了使用过程,又完善了处理措施,其中最突出的一点就是与数据库相结合自动解决了数据失效问题.<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />在ASP.NET2.0中为了解决数据失效问题,通过新类SQLCacheDependency建立起与新一代数据库的</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">SQL缓存依赖关系(SQL&nbsp;Express&nbsp;dependencycaching)</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">,这种关系可以使得数据库能够自动监视数据表的状况,一旦数据表发生了变化,立即启动数据库本身的触发器将相应的缓存区中的数据变为无效.<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />此方法也可用于SQL7</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">2000数据库,但是使用关必须先配置所监视的数据库.配置方法比较麻烦,但配置后使用起来还是很简单的.对于更早期版本的SQL&nbsp;Server或者其他类型的数据库(例如Oracle),则不能利用这一功能.<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />配置数据库连接池<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />C:\WINDOWS\Microsoft.NET\Framework\v2.</span><span style="COLOR: #000000">0.50727</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">aspnet_regsql.exe<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />运行&nbsp;asp.net&nbsp;sql&nbsp;Server配置向导<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />Aspnet_regsql.exe&nbsp;&ndash;S&nbsp;&ldquo;\DBNAME&rdquo;&nbsp;&ndash;E&nbsp;&ndash;d&nbsp;&ldquo;pubs&rdquo;&nbsp;&ndash;ed<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">E&nbsp;windows&nbsp;授权&nbsp;<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />&ndash;ed&nbsp;为enabled<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />Aspnet_regsql.exe&nbsp;&ndash;S&nbsp;&ldquo;\DBNAME&rdquo;&nbsp;&ndash;E&nbsp;&ndash;D&nbsp;&ldquo;pubs&rdquo;&nbsp;&ndash;et&nbsp;&ndash;t&nbsp;&ldquo;authors&rdquo;<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />当&nbsp;pubs.authors&nbsp;改变时改变缓存<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="COLOR: #000000">&lt;%</span><span style="COLOR: #000000">@&nbsp;OutputCache&nbsp;Duration</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">9999999</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">&nbsp;VaryByParam</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">none</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">&nbsp;SqlDependency</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">pubs.authors</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">%&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />缓存配置<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">caching</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">outputCache</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">diskCache&nbsp;enabled</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">true</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">&nbsp;maxSizePerApp</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">outputCache</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">outputCacheSettings</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">outputCacheProfiles</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">add&nbsp;name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">CacheFor60Seconds</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">&nbsp;duration</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">60</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">outputCacheProfiles</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">outputCacheSettings</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;!--</span><span style="COLOR: #000000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">sqlCacheDependency&nbsp;enabled</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">true</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">&nbsp;pollTime</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">1000</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">databases</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">add&nbsp;name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">PubsDB</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">&nbsp;connectionStringName</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">pubsConnectionString</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">databases</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">sqlCacheDependency</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">--&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">caching</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span>]]></description>
		</item>
		
			<item>
			<link>http://blog.edotpower.com/default.asp?id=137</link>
			<title><![CDATA[在.net中使用jquery的ajax]]></title>
			<author>star520dust@163.com(stardust)</author>
			<category><![CDATA[.Net]]></category>
			<pubDate>Tue,30 Dec 2008 21:57:06 +0800</pubDate>
			<guid>http://blog.edotpower.com/default.asp?id=137</guid>	
		<description><![CDATA[因为最近的项目需要使用在Asp.net下使用Ajax技术.进行了一些实际研究,原来想用Ext,但考虑到同组的哥几个一起开发,Ext的类库过大,并且它的优势在于UI方面;而对于微软官方的解决方案ASP.NET AJAX的类库还包括后台的类库觉得稍重量级了些.最后选择了jqury,轻量而优雅.
<p>对于jqury这个javascript类库,有官方的网站支持,感兴趣的想彻底研究的不妨移步过去:<a style="FONT-WEIGHT: 700; COLOR: #0000ff; TEXT-DECORATION: underline" tabindex="65535" href="http://www.jquery.com/" target="_blank">点这儿</a>.</p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 这里只提供自已使用jqury在Asp.net中的应用方案。</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp; 首先，要解决的问题是使用<strong>jQuery.getJSON(url,[data],[callback])</strong>方法中url，即要获取前台处理数据的地址。因为以前有过开发GIS的经验，所以知道一般GIS的解决方案是通过调用&ldquo;一般处理程序&rdquo;即以.ashx结尾的文件，它实际上是通过继承<strong>IHttpHandler</strong>这个接口来实现自定义返回给客户端自定义内容的。</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>IHttpHandler</strong>这个接口比较简单只有一个属性和一个方法:</font></p>
<p>&nbsp;</p>
<div class="cnblogs_code"><span style="COLOR: #008080">1</span><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" /><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> System;<br /></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" /><br /></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000"> System.Web<br /></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" alt="" /><img style="DISPLAY: none" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top" alt="" /></span><span style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif" alt="" /></span><span><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">interface</span><span style="COLOR: #000000"> IHttpHandler<br /></span><span style="COLOR: #008080">6</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" alt="" /><img style="DISPLAY: none" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif" alt="" /></span><span><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">7</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" alt="" /><img style="DISPLAY: none" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000"> IsReusable </span><span style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif" alt="" /></span><span><span style="COLOR: #000000">{ </span><span style="COLOR: #0000ff">get</span><span style="COLOR: #000000">; }</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">8</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /></span><span style="COLOR: #008080">9</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> ProcessRequest(HttpContext context);<br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp; }</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" alt="" />}</span></span></div>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其中<strong>ProcessRequest(HttpContext context)</strong>这个方法是我们关心的。在我们的.ashx文件中，我们就是要实现自已的ProcessRequest(HttpContext contex)，用它来给客户端返回前端数据。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第二个要解决的问题是C#的数据结构和javascript是完全不同的，所以C#的数据要返回给javascript处理，必须的找个桥梁。这里有两个选择：1.xml;2.<strong>JSON</strong>。因为这里只是简单的应用实现，所以我选择的是相对简单的JSON。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 方案已定，下面在自己的.ashx文件中可以这么实现ProcessRequest(HttpContext contex)方法：</p>
<p>&nbsp;</p>
<div class="cnblogs_code"><span style="COLOR: #008080">1</span><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" /><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> ProcessRequest(HttpContext context)<br /></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" alt="" /><img style="DISPLAY: none" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif" alt="" /></span><span><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.Response.ContentType </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">&quot;</span><span style="COLOR: #800000">text/plain</span><span style="COLOR: #800000">&quot;</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000"> data </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">&quot;</span><span style="COLOR: #800000">[{name:\</span><span style="COLOR: #800000">&quot;</span><span style="COLOR: #000000">fan\</span><span style="COLOR: #800000">&quot;</span><span style="COLOR: #800000">,age:26},{name:\</span><span style="COLOR: #800000">&quot;</span><span style="COLOR: #000000">wang\</span><span style="COLOR: #800000">&quot;</span><span style="COLOR: #800000">,age:25}]</span><span style="COLOR: #800000">&quot;</span><span style="COLOR: #000000">;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">构建的json数据<br /></span><span style="COLOR: #008080">5</span><span style="COLOR: #008000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">下面两句是用来测试前台向此页面发出的查询字符</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">6</span><span style="COLOR: #008000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.Response.Write(data);<br /></span><span style="COLOR: #008080">7</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">8</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" /></span></div>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; OK，后台的部分完成，剩下的就简单很多，在前台页面中请求这个.ashx即可：</p>
<p>&nbsp;&nbsp;</p>
<div class="cnblogs_code">
<p><img style="DISPLAY: none" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" alt="" /><img style="DISPLAY: inline" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" alt="" /><span class="cnblogs_code_Collapse" style="DISPLAY: none">Code</span><span style="DISPLAY: inline"><br /><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">script </span><span style="COLOR: #ff0000">language</span><span style="COLOR: #0000ff">=&quot;javascript&quot;</span><span style="COLOR: #ff0000"> type</span><span style="COLOR: #0000ff">=&quot;text/javascript&quot;</span><span style="COLOR: #ff0000"> src</span><span style="COLOR: #0000ff">=&quot;jquery-1.2.3.js&quot;</span><span style="COLOR: #0000ff">&gt;&lt;/</span><span style="COLOR: #800000">script</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">script </span><span style="COLOR: #ff0000">language</span><span style="COLOR: #0000ff">=&quot;javascript&quot;</span><span style="COLOR: #ff0000"> type</span><span style="COLOR: #0000ff">=&quot;text/javascript&quot;</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"><br />&nbsp;&nbsp; $(document).ready(</span><span style="COLOR: #0000ff; BACKGROUND-COLOR: #f5f5f5">function</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">(){<br />&nbsp;&nbsp;&nbsp;&nbsp; $.getJSON(<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">&quot;</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">AjaxHandler.ashx</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">&quot;</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">,</span><span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5">//</span><span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5">产生JSON数据的服务端页面</span><span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5"><br /></span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5">//</span><span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5">对返回的JSON数据进行处理，本例以列表的形式呈现</span><span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5"><br /></span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff; BACKGROUND-COLOR: #f5f5f5">function</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">(json){<br />&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5">//</span><span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5">循环取json中的数据,并呈现在列表中</span><span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5"><br />//</span><span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5">&nbsp;&nbsp;&nbsp; debugger;</span><span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5"><br /></span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">&nbsp;&nbsp;&nbsp;&nbsp; $.each(json,</span><span style="COLOR: #0000ff; BACKGROUND-COLOR: #f5f5f5">function</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">(i){<br />&nbsp;&nbsp;&nbsp;&nbsp; $(</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">&quot;</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">#cat-list</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">&quot;</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">).append(</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">&quot;</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">&lt;li&gt;name:</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">&quot;</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">+</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">json[i].name</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">+</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">&quot;</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">&amp;nbsp; Age:</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">&quot;</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">+</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">json[i].age</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">+</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">&quot;</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">&lt;/li&gt;</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">&quot;</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">)<br />&nbsp;&nbsp;&nbsp;&nbsp; })<br />&nbsp;&nbsp;&nbsp;&nbsp; });<br />&nbsp;&nbsp; });<br /></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">script</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">div </span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">=&quot;categories&quot;</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">h3 </span><span style="COLOR: #ff0000">title</span><span style="COLOR: #0000ff">=&quot;选择一个分区&quot;</span><span style="COLOR: #0000ff">&gt;&lt;</span><span style="COLOR: #800000">span</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">选择</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">span</span><span style="COLOR: #0000ff">&gt;&lt;/</span><span style="COLOR: #800000">h3</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"> <br /></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">ul </span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">=&quot;cat-list&quot;</span><span style="COLOR: #0000ff">&gt;&lt;/</span><span style="COLOR: #800000">ul</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">div</span><span style="COLOR: #0000ff">&gt;</span></span></p>
</div>]]></description>
		</item>
		
			<item>
			<link>http://blog.edotpower.com/default.asp?id=136</link>
			<title><![CDATA[.NET2.0 无刷新回调]]></title>
			<author>star520dust@163.com(stardust)</author>
			<category><![CDATA[.Net]]></category>
			<pubDate>Tue,30 Dec 2008 20:41:27 +0800</pubDate>
			<guid>http://blog.edotpower.com/default.asp?id=136</guid>	
		<description><![CDATA[<p>第一步：实现 ICallbackEventHandler 接口<br /><br />　　ICallbackEventHandler接口位于System.Web.UI命名空间下。在beta2时，ICallbackEventHandler只包含一个RaiseCallbackEvent方法，即处理回调事件，又返回处理结果。在正式版中，它变成了包含GetCallbackResult和RaiseCallbackEvent两个成员方法，第一个用来返回回调事件的结果，第二个用来出来回调事件。这个变化主要是为了编写Web控件而做的改动，具体可以看一下GridView等控件中的实现代码。<br /><br />　　建立一个 Web 网站，我们来修改 default.aspx.cs 文件： <br /><br />　　1 public partial class _Default : System.Web.UI.Page, ICallbackEventHandler <br />　　1 private string str; <br />　　2 public void RaiseCallbackEvent(string eventArgument) <br />　　3 { <br />　　4 //可以根据传递的参数不同，调用不同的处理逻辑 <br />　　5 str = &quot;从服务器端返回的内容：&quot; + eventArgument; <br />　　6 } <br />　　7 <br />　　8 public string GetCallbackResult() <br />　　9 { <br />　　10 return str; <br />　　11 } <br />　　12 <br /><br />　　第二步：注册回调方法<br /><br />　　我们在 default.aspx 页面中添加一个 TextBox ，一个 Label 和一个 Html 控件 Button ，并给 Button 添加 onclick 事件：<br /><br />1 &lt;asp:TextBox ID=&quot;TextBox1&quot; runat=&quot;server&quot;&gt;&lt;/asp:TextBox&gt;&nbsp;&nbsp;<br />2 &lt;input id=&quot;Button1&quot; type=&quot;button&quot; value=&quot;提交到Label1&quot; onclick=&quot;CallServer(TextBox1, Label1)&quot;/&gt;&lt;br/&gt;&nbsp;&nbsp;<br />3 &lt;asp:Label ID=&quot;Label1&quot; runat=&quot;server&quot; Text=&quot;Label1:&quot;&gt;&lt;/asp:Label&gt;&nbsp;&nbsp;<br />4&nbsp;&nbsp;<br /><br />1&nbsp;&nbsp;&nbsp;&nbsp; &lt;script type=&quot;text/javascript&quot;&gt;&nbsp;&nbsp; <br />2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //由button调用&nbsp;&nbsp;<br />3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function CallServer(inputcontrol, context)&nbsp;&nbsp;<br />4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; <br />5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.innerHTML = &quot;Loading&quot;;&nbsp;&nbsp;<br />6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arg = inputcontrol.value;&nbsp;&nbsp;<br />7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //注册回调方法&nbsp;&nbsp;<br />8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;%= ClientScript.GetCallbackEventReference(this, &quot;arg&quot;, &quot;ReceiveServerData&quot;, &quot;context&quot;)%&gt;;&nbsp;&nbsp; <br />9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;<br />10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //在回调方法中注册的接收返回结果的函数&nbsp;&nbsp;<br />11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function ReceiveServerData(result, context)&nbsp;&nbsp; <br />12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;<br />13&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.innerHTML = result;&nbsp;&nbsp;<br />14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;<br />15&nbsp;&nbsp;&nbsp;&nbsp; &lt;/script&gt;&nbsp;&nbsp;<br />16 <br /><br /><br />　　好了，一个无刷新的页面就开发完了，它可以将你在 TextBox 中输入的文字，通过服务器代码写回到页面的 Label 中。是不是很简单?你可以运行一下你的程序看看效果啦!<br /><br />　　下面我们来分析一下这些代码。<br /><br />　　首先，我们看<br /><br /><br /><br />&lt;%= ClientScript.GetCallbackEventReference(this, &quot;arg&quot;, &quot;ReceiveServerData&quot;, &quot;context&quot;)%&gt;;<br /><br /><br />　　ClientScript是System.Web.UI.Page对象的一个属性，它是System.Web.UI.ClientScriptManager对象。用于管理客户端脚本，GetCallbackEventReference方法用于注册一个服务器端事件的客户端回调。它的第四个参数&ldquo;Context&rdquo;非常重要，但在MSDN中并没有相关的例子和详细的说明。在我上面给的代码中可以看到，调用CallServer方法时，传递的Context参数就是Label1，而ReceiveServerData的第二个参数&ldquo;Context&rdquo;就是被传递过来的Label1。在我的例子中，Context被我用于设定一个用来显示服务端返回结果的控件。其实，你可以将任意的对象赋值给Context，它都会被传递给本地端处理回调返回结果的函数，这样，你就可以根据调用前指定的&ldquo;上下文&rdquo;灵活的操作返回结果了!在我给出的完整例子中，你可以看到一个使用Context做的无刷新显示GridView的例子。<br /><br /><br />　　在这里我要说个题外话，Context这么重要的参数在MSDN中不但没有详细的说明，而且VS2005中文正式版MSDN中关于回调的例子竟然还是beta2时的实现!这个版本的MSDN可以说是我用过的版本中品质最差的。不过现在的MSND可以用&ldquo;相当&rdquo;庞大来形容，出错也是在所难免的，希望下个版本的MSND会好一些。<br /><br />　　OK，在ASP.NET 2.0中开发具有Ajax特性的东东不难吧!其实就是两步：<br /><br />　　1、 在Server端实现ICallbackEventHandler接口，在接口包含的方法中根据传递的参数分别调用不同的处理方法，然后返回结果;<br /><br />　　2、 在Client端注册回调函数(当然你也可以在Server端注册)，然后实现处理回调结果的函数。其中，如果对Context能干灵活运行，你就可以做出非常好的效果了</p>
<p>第一步，在VS2005中建立一个新的WEB窗件。<br />&nbsp;&nbsp; 第二步，在ASPX中，放上一段HTML代码(如下)：</p>
<div><br />1&lt;body&gt;<br />2&nbsp;&nbsp;&nbsp; &lt;form id=&quot;form1&quot; runat=&quot;server&quot;&gt;<br />3&nbsp;&nbsp;&nbsp; &lt;div&gt;<br />4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;button onclick=&quot;CallServer()&quot;&gt;CallServer&lt;/button&gt;<br />5&nbsp;&nbsp;&nbsp; &lt;/div&gt;<br />6&nbsp;&nbsp;&nbsp; &lt;/form&gt;<br />7&lt;/body&gt;</div>
<div>&nbsp;&nbsp; 第三步，然后在&lt;HEAD&gt;&lt;/HEAD&gt;中放入一段JavaScript脚本：</div>
<div><br />1 &lt;script type=&quot;text/javascript&quot;&gt;<br />2&nbsp;&nbsp;&nbsp;&nbsp; function CallServer()<br />3&nbsp;&nbsp;&nbsp;&nbsp; {<br />4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var product = &quot;测试&quot;;<br />5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;%= ClientScript.GetCallbackEventReference(this, &quot;product&quot;, &quot;ReceiveServerData&quot;,null)%&gt;;<br />6&nbsp;&nbsp;&nbsp;&nbsp; }<br />7&nbsp;&nbsp;&nbsp;&nbsp; <br />8&nbsp;&nbsp;&nbsp;&nbsp; function ReceiveServerData(rValue)<br />9&nbsp;&nbsp;&nbsp;&nbsp; {<br />10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert(rValue);<br />11&nbsp;&nbsp;&nbsp;&nbsp; }<br />12 &lt;/script&gt;<br /></div>
<div>&nbsp;&nbsp; 第四步，在此ASPX的后台CS代码中，继承ICallbackEventHandler接口，并实现接口中的两个方法：<br />ICallbackEventHandler.GetCallbackResult() <br />&nbsp;&nbsp;&nbsp; 和<br />ICallbackEventHandler.RaiseCallbackEvent(string eventArgument)</div>
<div>&nbsp;&nbsp; 第五步，增加一个变量CallBackValue，并修改接口的两个方法为：</div>
<div><br />1 private string CallBackValue = string.Empty;<br />2&nbsp;&nbsp;&nbsp; <br />3 string ICallbackEventHandler.GetCallbackResult()<br />4 {<br />5 return CallBackValue + &quot;,ok&quot;;<br />6 }<br />7<br />8 void ICallbackEventHandler.RaiseCallbackEvent(string eventArgument)<br />9 {<br />10 this.CallBackValue = eventArgument;<br />11 }<br />12<br /></div>
<div>&nbsp;&nbsp;&nbsp; 第六步，运行，界面上会出现一个按钮，点击后，会将&ldquo;测试&rdquo;这个字符串传至后台，后台C#代码将字符串加上&ldquo;，OK&rdquo;后返回给客户端的JavaScript代码，并显示。</div>
<div>&nbsp;&nbsp;&nbsp; 以上六步，就可以实现无刷新回调了。现在，我们来分析一下几段代码。<br />&nbsp;&nbsp;&nbsp; 先看第三步中的JavaScript代码，其中的CallServer()方法中进行了回调，回调的语句为：<br />&lt;%= ClientScript.GetCallbackEventReference(this, &quot;product&quot;, &quot;ReceiveServerData&quot;,null)%&gt;;<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; 里面四个参数中第二个参数指定将product这个JavaScript中的字符串变量传回后台，第三个参数指定了从后台返回时接收返回信息的JavaScript方法ReceiveServerData(string Value)。</div>
<div>&nbsp;&nbsp;&nbsp; 第五步中后台的两个方法，一个ICallbackEventHandler.RaiseCallbackEvent(string eventArgument)用来接收前台JavaScript中传来的字符串变量，并赋值给内部变量this.CallBackValue，另一个方法ICallbackEventHandler.GetCallbackResult()将变更后的内部变量this.CallBackValue返回给前台JavaScript方法ReceiveServerData(string Value)。</div>
<div>&nbsp;&nbsp;&nbsp; 调用的顺序是： (前台)CallServer() --&gt; (后台)ICallbackEventHandler.RaiseCallbackEvent(string eventArgument) --&gt; (后台)ICallbackEventHandler.GetCallbackResult() --&gt; (前台)ReceiveServerData(string Value)。</div>
<div>&nbsp;&nbsp;&nbsp; 整个调用过程非常简单，而其中非常关键的一步是第三步的</div>]]></description>
		</item>
		
			<item>
			<link>http://blog.edotpower.com/default.asp?id=131</link>
			<title><![CDATA[.net之AJAX实践－更新等待实践]]></title>
			<author>star520dust@163.com(stardust)</author>
			<category><![CDATA[.Net]]></category>
			<pubDate>Thu,18 Dec 2008 12:03:21 +0800</pubDate>
			<guid>http://blog.edotpower.com/default.asp?id=131</guid>	
		<description><![CDATA[<p>在登录126邮箱时，如果时间过长，就会有一个登录动态图标显示<img alt="" src="http://www.ajaxload.info/cache/ff/ff/ff/00/00/00/17-0.gif" />。当然过快你可能都看不见，一闪而过。查看资料发现这个功能是通过AJAX技术来实现的。&nbsp;</p>
<p>在VS2005下使用AJAX，访问<a href="http://ajax.asp.net/"><font color="#336699">http://ajax.asp.net/</font></a>获取详细信息。微软的Atlas官方网站。</p>
<p>1 下载ASPAJAX扩展包：</p>
<p><a href="http://www.microsoft.com/downloads/info.aspx?na=90&amp;p=&amp;SrcDisplayLang=en&amp;SrcCategoryId=&amp;SrcFamilyId=ca9d90fa-e8c9-42e3-aa19-08e2c027f5d6&amp;u=http%3a%2f%2fdownload.microsoft.com%2fdownload%2f5%2f4%2f6%2f5462bcbd-e738-45fa-84ca-fa02b0c4e1c2%2fASPAJAXExtSetup.msi"><font color="#336699">http://www.microsoft.com/downloads/info.aspx?na=90&amp;p=&amp;SrcDisplayLang=en&amp;SrcCategoryId=&amp;SrcFamilyId=ca9d90fa-e8c9-42e3-aa19-08e2c027f5d6&amp;u=http%3a%2f%2fdownload.microsoft.com%2fdownload%2f5%2f4%2f6%2f5462bcbd-e738-45fa-84ca-fa02b0c4e1c2%2fASPAJAXExtSetup.msi</font></a><br /></p>
<p>2 下载AjaxControlToolkit.zip</p>
<p>同样在该网站有下.</p>
<p>3 关于页面更新时显示动画图标的讲解</p>
<p><a href="http://download.microsoft.com/download/a/1/3/a134c3ec-8244-4099-af4d-b18a6bf7ee32/HDI-AJAX-UpdateProgress.wmv"><font color="#336699">http://download.microsoft.com/download/a/1/3/a134c3ec-8244-4099-af4d-b18a6bf7ee32/HDI-AJAX-UpdateProgress.wmv</font></a><br /></p>
<p>4 代码(C#)的，不过网站同时也提供其它形式的代码。同时有大量的关于AJAX的实例讲解和代码。</p>
<p><a href="http://download.microsoft.com/download/a/1/3/a134c3ec-8244-4099-af4d-b18a6bf7ee32/HDI-AJAX-UpdateProgress-CS.zip"><font color="#336699">http://download.microsoft.com/download/a/1/3/a134c3ec-8244-4099-af4d-b18a6bf7ee32/HDI-AJAX-UpdateProgress-CS.zip</font></a><br /></p>
<p>5 我的测试：</p>
<p><font color="#3366ff">&lt;%@ Page Language=&quot;C#&quot; AutoEventWireup=&quot;true&quot; CodeFile=&quot;Default.aspx.cs&quot; Inherits=&quot;_Default&quot; %&gt;</font></p>
<p><font color="#3366ff">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.1//EN&quot; &quot;</font><a href="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"><font color="#3366ff">http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd</font></a><font color="#3366ff">&quot;&gt;<br />&lt;html xmlns=&quot;</font><a href="http://www.w3.org/1999/xhtml"><font color="#3366ff">http://www.w3.org/1999/xhtml</font></a><font color="#3366ff">&quot;&gt;<br />&lt;head runat=&quot;server&quot;&gt;<br />&nbsp;&nbsp;&nbsp; &lt;title&gt;Untitled Page&lt;/title&gt;<br />&lt;/head&gt;<br />&lt;body&gt;<br />&nbsp;&nbsp;&nbsp; &lt;form id=&quot;form1&quot; runat=&quot;server&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;asp:ScriptManager ID=&quot;ScriptManager1&quot; runat=&quot;server&quot; /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;div&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;asp:UpdateProgress ID=&quot;UpdateProgress1&quot; runat=&quot;server&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ProgressTemplate&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;img src=&quot;indicator_mozilla_blu.gif&quot; /&gt;系统正在处理 请稍后...<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ProgressTemplate&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/asp:UpdateProgress&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/div&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;asp:UpdatePanel ID=&quot;UpdatePanel1&quot; runat=&quot;server&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ContentTemplate&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;nbsp; 密码:&lt;asp:TextBox ID=&quot;TextBox2&quot; runat=&quot;server&quot;&gt;&lt;/asp:TextBox&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;br /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 密码确认:&lt;asp:TextBox ID=&quot;TextBox1&quot; runat=&quot;server&quot;&gt;&lt;/asp:TextBox&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;asp:Button ID=&quot;Button1&quot; runat=&quot;server&quot; OnClick=&quot;Button1_Click&quot; Text=&quot;Button&quot; /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ContentTemplate&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/asp:UpdatePanel&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/form&gt;&nbsp;&nbsp;&nbsp; <br />&lt;/body&gt;<br />&lt;/html&gt;</font></p>
<p><font color="#000000">6 对应的cs代码：</font></p>
<p><font color="#3366ff"></font><font color="#0000ff">using System;<br />using System.Data;<br />using System.Configuration;<br />using System.Web;<br />using System.Web.Security;<br />using System.Web.UI;<br />using System.Web.UI.WebControls;<br />using System.Web.UI.WebControls.WebParts;<br />using System.Web.UI.HtmlControls;</font></p>
<p><font color="#0000ff">public partial class _Default : 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; }<br />&nbsp;&nbsp;&nbsp; protected void Button1_Click(object sender, EventArgs e)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //System.Threading.Thread.Sleep(3000);</font></p>
<p><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 下面是模拟处理过程</font></p>
<p><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int j = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; 100000000; i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; j = i+j;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (TextBox1.Text.Equals(TextBox2.Text))<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; Response.Redirect(&quot;/login.aspx&quot;);<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<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; Response.Redirect(&quot;/error.aspx&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; }<br />}</font><br /></p>
<p>7 图标下载地址</p>
<p><a href="http://www.napyfab.com/ajax-indicators/"><font color="#336699">http://www.napyfab.com/ajax-indicators/</font></a></p>
<p><a href="http://www.ajaxload.info/"><font color="#336699">http://www.ajaxload.info/</font></a><a href="http://mentalized.net/activity-indicators/"></a></p>
<p>测试通过<br /></p>
<p>推荐去处：<a href="http://hi.baidu.com/yeqijiao/blog/item/9da307971c65366c54fb964f.html"><font color="#336699">http://hi.baidu.com/yeqijiao/blog/item/9da307971c65366c54fb964f.html</font></a></p>
<p><a href="http://www.cnblogs.com/dflying/archive/2006/04/01/363998.aspx"><font color="#336699">http://www.cnblogs.com/dflying/archive/2006/04/01/363998.aspx</font></a></p>
<p><a href="http://www.cnblogs.com/dflying/archive/2006/04/01/363998.aspx"><font color="#336699">http://ajax.asp.net/docs/default.aspx</font><br /></a></p>]]></description>
		</item>
		
			<item>
			<link>http://blog.edotpower.com/default.asp?id=130</link>
			<title><![CDATA[asp.net 2.0 下设置和使用FCKeditor文本编辑器 ]]></title>
			<author>star520dust@163.com(stardust)</author>
			<category><![CDATA[.Net]]></category>
			<pubDate>Thu,18 Dec 2008 11:58:54 +0800</pubDate>
			<guid>http://blog.edotpower.com/default.asp?id=130</guid>	
		<description><![CDATA[<p>首先下载FCKeditor。</p>
<p>FCKeditor的下载地址<br /><a href="http://www.fckeditor.net/download/default.html"><font color="#1a8bc8">http://www.fckeditor.net/download/default.html</font></a></p>
<p>我使用的是当前最新版本FCKeditor 2.3</p>
<p>下载 ZIP File (source code included):&nbsp; FCKeditor_2.3.zip <br />和<br />FCKeditor.Net_2.2.zip </p>
<p>FCKeditor解压后，我们只取我们需要的部分(这个可以参照网上很多文章)，我就记录一下了。</p>
<p>保留editor文件夹、fckconfig.js、fckeditor.js、fckstyles.xml、fcktemplates.xml<br />其他的不需要，所有&ldquo;_&rdquo;开头的文件和文件夹都是范例或者是源文件。</p>
<p>进入filemanager文件夹，有browser和upload两个文件夹。进入browser\default\connectors，只保留aspx文件夹，其余的删掉，有一个test.html文件要留下，如果上传的时候出现错误，还要用他进行测试呢。upload也一样，只保留aspx文件夹；</p>
<p>编辑 fckconfig.js 文件</p>
<p>修改 <br />FCKConfig.DefaultLanguage&nbsp; = 'en' ;<br />为<br />FCKConfig.DefaultLanguage&nbsp; = 'zh-cn' ;</p>
<p>修改<br />var _FileBrowserLanguage = 'asp' ; // asp | aspx | cfm | lasso | perl | php | py<br />var _QuickUploadLanguage = 'asp' ; // asp | aspx | cfm | lasso | php<br />为<br />var _FileBrowserLanguage = 'aspx' ; // asp | aspx | cfm | lasso | perl | php | py<br />var _QuickUploadLanguage = 'aspx' ; // asp | aspx | cfm | lasso | php</p>
<p>找到第40行 FCKConfig.TabSpaces = 0 ; 改为FCKConfig.TabSpaces = 1 ; 即在编辑器域内可以使用Tab键。</p>
<p>如果你的编辑器还用在网站前台的话，比如说用于留言本或是日记回复时，那就不得不考虑安全了，在前台千万不要使用Default的toolbar，要么自定义一下功能，要么就用系统已经定义好的Basic，也就是基本的toolbar，<br />找到第64行：</p>
<p>FCKConfig.ToolbarSets[&quot;Basic&quot;] = [<br />['Bold','Italic','-','OrderedList','UnorderedList','-',/*'Link',*/'Unlink','-','Style','FontSize','TextColor','BGColor','-','Smiley','SpecialChar','Replace','Preview']<br />] ;</p>
<p>这是我改过的Basic，把图像功能去掉，把添加链接功能去掉，因为图像和链接和flash和图像按钮添加功能都能让前台页直接访问和上传文件，要是这儿不改直接给你上传个木马还不马上玩完？但是光这样还不行，fckeditor还支持编辑域内的鼠标右键功能。</p>
<p>&nbsp;</p>
<p>找到 第77行：</p>
<p>FCKConfig.FontNames = 'Arial;Comic Sans MS;Courier New;Tahoma;Times New Roman;Verdana' ;</p>
<p>加上几种我们常用的字体 FCKConfig.FontNames = '宋体;黑体;隶书;楷体_GB2312;Arial;Comic Sans MS;Courier New;Tahoma;Times New Roman;Verdana'</p>
<p>编辑器域内默认的显示字体为12px，想要修改可以通过修改样式表来达到要求，打开/editor/css/fck_editorarea.css，把第4行改为 font-size: 14px;即可。</p>
<p>在web.config中加入</p>
<p>&lt;appSettings&gt;<br />&nbsp; &lt;add key=&quot;FCKeditor:BasePath&quot; value=&quot;~/&quot;/&gt;<br />&nbsp; &lt;add key=&quot;FCKeditor:UserFilesPath&quot; value=&quot;/weste/Files&quot; /&gt;<br />&lt;/appSettings&gt;<br />要加在&lt;system.web&gt;...&lt;/system.web&gt;外面，注意weste是我的工程目录，要根据实际需要进行修改，记住在工程完成后发布时要把/weste/Files根据实际情况修改一下，或者是/Files或者是/web/Files。开发阶段在运行项目时的URL是<a href="http://localhost/"><font color="#1a8bc8">http://localhost/</font></a>项目名称/的形式，发布后在服务器上建立站点，根路径就是<a href="http://www.abc.com/"><font color="#1a8bc8">http://www.abc.com/</font></a>的形式，所以发布后一定要改过来。</p>
<p>差不多就这样了。对了，还要在工程目录中建立一个相对应的目录Files。</p>
<p>用VS.NET2003建立项目weste，引用 FCKeditor.Net_2.2.zip 解压下的 bin\Release\FredCK.FCKeditorV2.dll 文件。</p>
<p>编写一个最简单的页面</p>
<p>&lt;%@ Register TagPrefix=&quot;FCKeditorV2&quot; Namespace=&quot;FredCK.FCKeditorV2&quot; Assembly=&quot;FredCK.FCKeditorV2&quot; %&gt;<br />&lt;%@ Page language=&quot;c#&quot; Codebehind=&quot;WebForm1.aspx.cs&quot; AutoEventWireup=&quot;false&quot; Inherits=&quot;weste.WebForm1&quot; validateRequest=false%&gt;</p>
<p>// 这里要主要两个参数 <br />// 默认为 &lt;%@ Page language=&quot;c#&quot; Codebehind=&quot;WebForm1.aspx.cs&quot; AutoEventWireup=&quot;false&quot; Inherits=&quot;weste.WebForm1&quot; %&gt;<br />// 我们要添加一个参数 validateRequest=false，否则提交带html代码的内容会报错<br />// 从客户端(...)中检测到有潜在危险的 Request.Form 值。</p>
<p>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0 Transitional//EN&quot; &gt;<br />&lt;HTML&gt;<br />&nbsp;&lt;HEAD&gt;<br />&nbsp; &lt;title&gt;WebForm1&lt;/title&gt;<br />&nbsp;&nbsp;&lt;/HEAD&gt;<br />&nbsp;&lt;body MS_POSITIONING=&quot;GridLayout&quot;&gt;<br />&nbsp; &lt;form id=&quot;Form1&quot; method=&quot;post&quot; runat=&quot;server&quot;&gt;<br />&nbsp;&nbsp; &lt;FCKeditorV2:FCKeditor id=&quot;FCKeditor1&quot; runat=&quot;server&quot;&gt;&lt;/FCKeditorV2:FCKeditor&gt;<br />&nbsp; &lt;/form&gt;<br />&nbsp;&lt;/body&gt;<br />&lt;/HTML&gt;</p>
<p>如果要看提交内容的话，可以用 TextBox1.Text = HttpUtility.HtmlEncode(FCKeditor1.Value)。<br /><br />如果要修改保存的内容，这可以用HttpUtility.HtmlDecode(ds.Tables[tablename].Rows[0][&quot;fginfo&quot;].ToString())来回调用;</p>]]></description>
		</item>
		
			<item>
			<link>http://blog.edotpower.com/default.asp?id=123</link>
			<title><![CDATA[在asp.net 2.0中结合母板页使用meta标签（扩展@Page指令） ]]></title>
			<author>star520dust@163.com(stardust)</author>
			<category><![CDATA[.Net]]></category>
			<pubDate>Mon,24 Nov 2008 16:52:06 +0800</pubDate>
			<guid>http://blog.edotpower.com/default.asp?id=123</guid>	
		<description><![CDATA[该文章转载自网络大本营：<a href="http://www.pushad.com/Info/10377.Html">http://www.pushad.com/Info/10377.Html</a><br /><br />母板页是asp.Net 2.0中的一个非常强大的特性，但是它却不能提供一个实现最基础的针对搜索引擎优化的方法。如果你想你的web页被搜索引擎收录并提高排名，那么你就需要在每一个页都指定一个title和meta标记。本文将说明如何扩展你的asp.Net页，以使得在使用母板页的时候你可以直接在你内容页的@Page指令中指定你的meta标签的描述和meta标签的关键字
<p><br />背景<br />当你要针对搜索引擎优化你的web页的时候，设置页的title标签和页的meta描述是其中最重要的因素之一。&lt; title&gt;和meta标签实际上是在每个页的HTML的&lt;head&gt;部分，下面出示一个Rhinoback online backup的例子。</p>
<p><br />&lt;html Xmlns=&quot;<a href="http://www.w3.org/1999/xhtml">http://www.w3.org/1999/xhtml</a>&quot; &gt;<br />&lt;head&gt;<br />&lt;title&gt;<br />&nbsp;&nbsp; Rhinoback Professional Secure Online Backup Services for Small and Medium Business - SMB<br />&lt;/title&gt;<br />&lt;meta name=&quot;description&quot; content=&quot;Professional Online Backup Services. <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Rhinoback provides robust backup functionality at affordable prices.&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Premium features, premium services, low prices.&nbsp; Get the most for <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; your money with Rhinoback!&quot; /&gt;<br />&lt;meta name=&quot;keywords&quot; content=&quot;backup, online backup, secure backup, cheap backup, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; free backup, offsite backup,inte.Net backup, secure files, offsite data storage, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; privacy, security, features, low prices, premium service, remote backup&quot; /&gt;<br />&lt;/head&gt;<br />&lt;body&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- page content --&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;</p>
<p>&lt;title&gt;标签的文本显示在浏览器的顶端。从下面的例子中可以看到&lt;title&gt;在IE中的显示</p>
<p><br />当你的页被搜索引擎收录的时候，meta描述的文本则在搜索引擎的列表中显示。下面的例子来自google。带下划线的标题的下面的文本就来自页的meta描述标签。如果没有meta描述标签，那你的页在搜索引擎的列表中将显示为你的页上的某一处的文本。指定你的每一个页的描述文本要比把这些事情交给搜索引擎做好的多。</p>
<p>母板页已经被证明是asp.Net 2.0中非常有用的一个特性。本文不是来说明母板页的细节或是如何实现它，因为这样的文章太多了。当我们在母板页中使用了&lt;head&gt;的话，那么母板页下的所有内容页都将自动的包括这个&lt;head&gt;。幸运的是开发人员可以在内容页中直接在@Page指令中修改title属性来修改内容页的title。</p>
<p><br />&lt;%@ Page Language=&quot;C#&quot; MasterPageFile=&quot;~/PageTags.master&quot; AutoEventWireup=&quot;true&quot; CodeFile=&quot;home.aspx.cs&quot; Inherits=&quot;home&quot; Title=&quot;My home page title&quot; %&gt;</p>
<p>上面的@Page指令说明了这是一个使用了母板页的内容页。如果你要指定meta标签的话，应该在内容页中指定。你可以看到@Page指令中有一个 &ldquo;Description&rdquo;属性，但是它不能在你的页上创建meta描述标签。事实上，即使你指定了&ldquo;Description&rdquo;属性，最后也会被忽略掉而不做任何事的。</p>
<p>我不可能让站点的所有页都使用同一个描述，而且我想给每一页都加一个关键字。我们首先想到的解决办法就是在后置代码中插入我们想要的meta标签到每一个页的&lt;head&gt;里，就像如下的做法<br />C#</p>
<p><br />protected void Page_Load(object sender, EventArgs e)<br />{<br />&nbsp;&nbsp;&nbsp; HtmlMeta tag = new HtmlMeta();<br />&nbsp;&nbsp;&nbsp; tag.Name = &quot;description&quot;;<br />&nbsp;&nbsp;&nbsp; tag.Content = &quot;My description for this page&quot;;<br />&nbsp;&nbsp;&nbsp; Header.Controls.Add(tag);<br />}</p>
<p>VB</p>
<p><br />Sub Page_Load()Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)<br />&nbsp;&nbsp;&nbsp; Dim tag As HtmlMeta = New HtmlMeta()<br />&nbsp;&nbsp;&nbsp; tag.Name = &quot;description&quot;<br />&nbsp;&nbsp;&nbsp; tag.Content = &quot;My description for this page&quot;<br />&nbsp;&nbsp;&nbsp; Header.Controls.Add(tag)<br />End Sub</p>
<p>这种解决方法有一个问题，就是页的标题，meta描述，meta关键字都是相互关联的，所以我们想的是最好让标题和描述在同一个文件中指定。在 Page_Load方法里确实可以很简单的在.aspx页中加入一个&lt;script&gt;标签，但是我想要一个更简单的设置和检查每一页标签的解决方案。</p>
<p>在接下来的方案中我们会看到如何通过扩展@Page指令给每一页加上meta标签。</p>
<p><br />解决方案<br />我创建了一个继承自System.Web.UI.Page的page基类，并且让我的内容页继承自我的BasePage 类。BasePage类包含了在.aspx页中给header控件中增加meta标签的代码，当我们继承了BasePage的之后，这段代码就只需要在一个地方存在，而不用每一页都写一遍。<br />C#</p>
<p><br />using System;<br />using System.Web.UI;<br />using System.Web.UI.HtmlControls;<br />using System.Text.RegularExpressions;</p>
<p>/**//// &lt;SUMMARY&gt;<br />/// 为了给内容页增加meta标签而扩展基类<br />/// &lt;/SUMMARY&gt;<br />public class BasePage : Page<br />{<br />&nbsp;&nbsp;&nbsp; private string _keywords;<br />&nbsp;&nbsp;&nbsp; private string _description;<br />&nbsp;&nbsp;&nbsp; // 构造函数<br />&nbsp;&nbsp;&nbsp; // 增加一个Init的事件处理<br />&nbsp;&nbsp;&nbsp; public BasePage()<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Init += new EventHandler(BasePage_Init);<br />&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; // 页将使用这个基类初始化<br />&nbsp;&nbsp;&nbsp; // 如果可用则增加meta关键字和meta描述<br />&nbsp;&nbsp;&nbsp; void BasePage_Init(object sender, EventArgs e)<br />&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!String.IsNullOrEmpty(Meta_Keywords))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HtmlMeta tag = new HtmlMeta();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tag.Name = &quot;keywords&quot;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tag.Content = Meta_Keywords;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Header.Controls.Add(tag);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!String.IsNullOrEmpty(Meta_Description))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HtmlMeta tag = new HtmlMeta();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tag.Name = &quot;description&quot;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tag.Content = Meta_Description;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Header.Controls.Add(tag);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**//// &lt;SUMMARY&gt;<br />&nbsp;&nbsp;&nbsp; /// 获取或设置页的meta关键字<br />&nbsp;&nbsp;&nbsp; /// &lt;/SUMMARY&gt;<br />&nbsp;&nbsp;&nbsp; public string Meta_Keywords<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return _keywords; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set <br />&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;&nbsp;&nbsp;&nbsp;&nbsp; // 译者注：\s匹配任何空白字符，包括空格、制表符、换页符等等。等价于 [\f\n\r\t\v]。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _keywords = Regex.Replace(value, &quot;<a href="http://blog.edotpower.com/file://s/">file://s/</a>+&quot;, &quot; &quot;); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**//// &lt;SUMMARY&gt;<br />&nbsp;&nbsp;&nbsp; /// 获取或设置页的meta描述<br />&nbsp;&nbsp;&nbsp; /// &lt;/SUMMARY&gt;<br />&nbsp;&nbsp;&nbsp; public string Meta_Description<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return _description; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set <br />&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;&nbsp;&nbsp;&nbsp;&nbsp; // 译者注：\s匹配任何空白字符，包括空格、制表符、换页符等等。等价于 [\f\n\r\t\v]。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _description = Regex.Replace(value, &quot;<a href="http://blog.edotpower.com/file://s/">file://s/</a>+&quot;, &quot; &quot;); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />}</p>
<p>VB</p>
<p><br />Imports System<br />Imports System.Web.UI<br />Imports System.Web.UI.HtmlControls<br />Imports System.Text.RegularExpressions</p>
<p><br />' 为了给内容页增加meta标签而扩展基类</p>
<p>Public Class BasePageClass BasePage<br />&nbsp;&nbsp;&nbsp; Inherits Page</p>
<p>&nbsp;&nbsp;&nbsp; Dim _keywords As String<br />&nbsp;&nbsp;&nbsp; Dim _description As String<br />&nbsp;&nbsp;&nbsp; ' 页将使用这个基类初始化<br />&nbsp;&nbsp;&nbsp; ' 增加一个Init的事件处理<br />&nbsp;&nbsp;&nbsp; Public Sub New()Sub New()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AddHandler Init, New EventHandler(AddressOf BasePage_Init)<br />&nbsp;&nbsp;&nbsp; End Sub</p>
<p>&nbsp;&nbsp;&nbsp; ' 页将使用这个基类初始化<br />&nbsp;&nbsp;&nbsp; ' 如果可用则增加meta关键字和meta描述<br />&nbsp;&nbsp;&nbsp; Sub BasePage_Init()Sub BasePage_Init(ByVal sender As Object, ByVal e As EventArgs)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If Not String.IsNullOrEmpty(Meta_Keywords) Then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim tag As HtmlMeta = New HtmlMeta()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tag.Name = &quot;keywords&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tag.Content = Meta_Keywords<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Header.Controls.Add(tag)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If Not String.IsNullOrEmpty(Meta_Description) Then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim tag As HtmlMeta = New HtmlMeta()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tag.Name = &quot;description&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tag.Content = Meta_Description<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Header.Controls.Add(tag)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br />&nbsp;&nbsp;&nbsp; End Sub</p>
<p><br />&nbsp;&nbsp;&nbsp; '获取或设置页的meta关键字<br />&nbsp;&nbsp;&nbsp; Public Property Meta_Keywords()Property Meta_Keywords() As String<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Get<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return _keywords<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End Get<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 删掉多余的空格<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 译者注：\s匹配任何空白字符，包括空格、制表符、换页符等等。等价于 [\f\n\r\t\v]。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _keywords = Regex.Replace(value, &quot;<a href="http://blog.edotpower.com/file://s/">file://s/</a>+&quot;, &quot; &quot;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End Set<br />&nbsp;&nbsp;&nbsp; End Property</p>
<p><br />&nbsp;&nbsp;&nbsp; ' 获取或设置页的meta描述<br />&nbsp;&nbsp;&nbsp; Public Property Meta_Description()Property Meta_Description() As String<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Get<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return _description<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End Get<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set(ByVal value As String)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 删掉多余的空格<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' 译者注：\s匹配任何空白字符，包括空格、制表符、换页符等等。等价于 [\f\n\r\t\v]。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _description = Regex.Replace(value, &quot;<a href="http://blog.edotpower.com/file://s/">file://s/</a>+&quot;, &quot; &quot;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End Set<br />&nbsp;&nbsp;&nbsp; End Property<br />End Class</p>
<p>Meta_Keywords属性和Meta_Description属性是公共的，你可以在类实例化后设置它们。当某个类继承自这个类并被初始化后，Base_Init将被调用并在页中增加meta标签</p>
<p>C#</p>
<p><br />public partial class home : BasePage <br />{<br />&nbsp;&nbsp;&nbsp; protected void Page_Load(object sender, EventArgs e)<br />&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp; }<br />}</p>
<p>VB</p>
<p><br />Partial Class homeClass home<br />&nbsp;&nbsp;&nbsp; Inherits BasePage<br />&nbsp;&nbsp;&nbsp; Sub Page_Load()Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; End Sub<br />End Class</p>
<p>注意每一个继承自BasePage的页都可以通过属性或代码来插入meta标签。现在我们可以直接在.aspx文件的@Page指令中指定Meta_Keywords属性和Meta_Description属性的值。示例如下</p>
<p><br />&lt;%@ Page Language=&quot;C#&quot; MasterPageFile=&quot;~/PageTags.master&quot; AutoEventWireup=&quot;true&quot; CodeFile=&quot;home.aspx.cs&quot; Inherits=&quot;home&quot;&nbsp; <br />&nbsp;&nbsp;&nbsp; CodeFileBaseClass=&quot;BasePage&quot; <br />&nbsp;&nbsp;&nbsp; Title=&quot;My home page title&quot; <br />&nbsp;&nbsp;&nbsp; Meta_Keywords=&quot;page directive, extension, do.Net, asp.Net&quot;<br />&nbsp;&nbsp;&nbsp; Meta_Description=&quot;This is the meta description for my home page.&quot;&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; <br />%&gt;</p>
<p>&lt;asp:Content ID=&quot;Content1&quot; ContentPlaceHolderID=&quot;ContentPlaceHolder1&quot; Runat=&quot;Server&quot;&gt;<br />&nbsp;&nbsp;&nbsp; &lt;h3&gt;My home page content&lt;h3&gt;<br />&nbsp;&nbsp;&nbsp; &lt;p&gt;<br />&nbsp;&nbsp;&nbsp; This is the content on my home page.&nbsp; This page has an appropriate title tag and<br />&nbsp;&nbsp;&nbsp; also has meta tags for keywords and description that are relative to this page.<br />&nbsp;&nbsp;&nbsp; The title tag is essential to good search engine optimization and the meta<br />&nbsp;&nbsp;&nbsp; description is the text that the search engine will display when your <br />&nbsp;&nbsp;&nbsp; page is listed in search results.&nbsp; The title and meta description should be<br />&nbsp;&nbsp;&nbsp; set specific to each page and should describe the content of the page. <br />&nbsp;&nbsp;&nbsp; &lt;/p&gt;<br />&lt;/asp:Content&gt;</p>
<p>注意这里增加了一个CodeFileBaseClass属性，这是必需的，它可以引用BasePage类的公共属性</p>
<p><br />重点提要<br />你应该注意到了，在BasePage类里使用了正则表达式。这是因为在你的.aspx里添加描述和关键字的时候可能会是多行，就像下面这个例子似的</p>
<p><br />&lt;%@ Page Language=&quot;C#&quot; MasterPageFile=&quot;~/IdeaScope.master&quot; AutoEventWireup=&quot;true&quot; <br />&nbsp; CodeFile=&quot;is.aspx.cs&quot; Inherits=&quot;_is&quot;<br />&nbsp; CodeFileBaseClass=&quot;BasePage&quot; <br />&nbsp; <br />&nbsp; Title=&quot;Effective Customer Feedback Management, Improve Customer Commmunication&quot; <br />&nbsp; <br />&nbsp; Meta_Keywords=&quot;Customer Feedback, Customer Opinion, feedback, opinion,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; idea, ideas, idea management, customer feedback management,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; product management, product manager, product marketing,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; product marketing manager&quot;<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; <br />&nbsp; Meta_Description=&quot;IdeaScope is an on-demand and embedded solution that allows <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; you to capture, prioritize and centrally manage customer feedback. Make your<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; customer feedback process more efficient. Save time and involve more <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stakeholders without significant cost.&quot;&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; <br />%&gt;</p>
<p>如果不用正则表达式转换它们的话，这些标记就会包含很多的新行和空格，这会使一些搜索引擎不知所措，所以我们要让这些标记方便搜索引擎的收录。</p>
<p>还有另外一个问题就是，Visual Studio 2005不认识Meta_Keywords属性和Meta_Description属性。你如果在@Page指令中指定了这两个属性的话，将会看到这些属性的下面会出现红色的波浪线，VS2005会认为它们是无效的，但实际上它仍然可以正确的编译和运行。如果你不想看到这些错误的话，你可以在Visual Studio的schema里给@Page指令增加如下代码。</p>
<p><br />&lt;xsd:attribute name=&quot;Meta_Keywords&quot; vs:nonfilterable=&quot;true&quot; /&gt;<br />&lt;xsd:attribute name=&quot;Meta_Description&quot; vs:nonfilterable=&quot;true&quot; /&gt;</p>
<p>这些节点应该作为&lt;xsd:complexType name=&quot;PageDef&quot;&gt;的子节点被插入，如果你把Visual Studio 2005安装在默认路径，那么这个schema文件的路径则是</p>
<p>C:\Program Files\Microsoft Visual Studio 8\Common7\Packages\schemas\html\page_directives.xsd</p>
<p>本文示范了如何通过扩展@Page指令使其支持meta关键字和meta描述。你也可以使用相同的方法增加其他的meta标签。原码文件和示例项目包括了c#和VB两种语言。感谢Scott Guthrie的博客文章，.Net/scottgu/archive/2005/08/02/421405.aspx&quot; target=_blank&gt;Obsure but cool feature in ASP.Net 2.0一文为本解决方案提供了技术支持。</p>]]></description>
		</item>
		
			<item>
			<link>http://blog.edotpower.com/default.asp?id=122</link>
			<title><![CDATA[c#常用的正则表达式，其实对所有语言都通用，常用正则表达式总结]]></title>
			<author>star520dust@163.com(stardust)</author>
			<category><![CDATA[.Net]]></category>
			<pubDate>Thu,20 Nov 2008 17:47:18 +0800</pubDate>
			<guid>http://blog.edotpower.com/default.asp?id=122</guid>	
		<description><![CDATA[<p><strong>c#一些常用的正则表达式总结，应该有些用处，可以收藏起来慢慢看 </strong>（对所有语言通用)</p>
<p>注意写的时候要加上一个@哦，比如&nbsp; Regex re = new Regex(@&quot;www.crazycoder.cn&quot;, RegexOptions.IgnoreCase); 否则C#中的反斜杠要用转义字符来表示，比如使用\\代替\</p>
<p>只能输入数字：&quot;^[0-9]*$&quot;。<br />只能输入n位的数字：&quot;^\d{n}$&quot;。<br />只能输入至少n位的数字：&quot;^\d{n,}$&quot;。<br />只能输入m~n位的数字：。&quot;^\d{m,n}$&quot;<br />只能输入零和非零开头的数字：&quot;^(0|[1-9][0-9]*)$&quot;。<br />只能输入有两位小数的正实数：&quot;^[0-9]+(.[0-9]{2})?$&quot;。<br />只能输入有1~3位小数的正实数：&quot;^[0-9]+(.[0-9]{1,3})?$&quot;。<br />只能输入非零的正整数：&quot;^\+?[1-9][0-9]*$&quot;。<br />只能输入非零的负整数：&quot;^\-[1-9][]0-9&quot;*$。<br />只能输入长度为3的字符：&quot;^.{3}$&quot;。<br />只能输入由26个英文字母组成的字符串：&quot;^[A-Za-z]+$&quot;。<br />只能输入由26个大写英文字母组成的字符串：&quot;^[A-Z]+$&quot;。<br />只能输入由26个小写英文字母组成的字符串：&quot;^[a-z]+$&quot;。<br />只能输入由数字和26个英文字母组成的字符串：&quot;^[A-Za-z0-9]+$&quot;。<br />只能输入由数字、26个英文字母或者下划线组成的字符串：&quot;^\w+$&quot;。<br />验证用户密码：&quot;^[a-zA-Z]\w{5,17}$&quot;正确格式为：以字母开头，长度在6~18之间，只能包含字符、数字和下划线。<br />验证是否含有^%&amp;',;=?$\&quot;等字符：&quot;[^%&amp;',;=?$\x22]+&quot;。<br />只能输入汉字：&quot;^[\u4e00-\u9fa5]{0,}$&quot;<br />验证Email地址：&quot;^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$&quot;。<br />验证InternetURL：&quot;^http://([\w-]+\.)+[\w-]+(/[\w-./?%&amp;=]*)?$&quot;。<br />验证电话号码：&quot;^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$&quot;正确格式为：&quot;XXX-XXXXXXX&quot;、&quot;XXXX-XXXXXXXX&quot;、&quot;XXX-XXXXXXX&quot;、&quot;XXX-XXXXXXXX&quot;、&quot;XXXXXXX&quot;和&quot;XXXXXXXX&quot;。<br />验证身份证号（15位或18位数字）：&quot;^\d{15}|\d{18}$&quot;。<br />验证一年的12个月：&quot;^(0?[1-9]|1[0-2])$&quot;正确格式为：&quot;01&quot;～&quot;09&quot;和&quot;1&quot;～&quot;12&quot;。<br />验证一个月的31天：&quot;^((0?[1-9])|((1|2)[0-9])|30|31)$&quot;正确格式为；&quot;01&quot;～&quot;09&quot;和&quot;1&quot;～&quot;31&quot;。 <br />利用正则表达式限制网页表单里的文本框输入内容：</p>
<p>用 正则表达式限制只能输入中文：onkeyup=&quot;value=value.replace(/[^\u4E00-\u9FA5]/g,'')&quot; onbeforepaste=&quot;clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4E00-\u9FA5]/g,''))&quot;</p>
<p>用正则表达式限制只能输入全角字符：&nbsp;onkeyup=&quot;value=value.replace(/[^\uFF00-\uFFFF] /g,'')&quot; onbeforepaste=&quot;clipboardData.setData('text',clipboardData.getData('text').replace(/[^\uFF00-\uFFFF]/g,''))&quot;</p>
<p>用正则表达式限制只能输入数字：onkeyup=&quot;value=value.replace(/[^\d]/g,'') &quot;onbeforepaste=&quot;clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))&quot;</p>
<p>用正则表达式限制只能输入数字和英文：onkeyup=&quot;value=value.replace(/[\W]/g,'') &quot;onbeforepaste=&quot;clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))&quot;</p>
<p>得用正则表达式从URL地址中提取文件名的javascript程序，如下结果为page1</p>
<p>s=&quot;http://www.9499.net/page1.htm&quot;<br />s=s.replace(/(.*\/){0,}([^\.]+).*/ig,&quot;$2&quot;)<br />alert(s)</p>
<p>匹配双字节字符(包括汉字在内)：[^\x00-\xff]</p>
<p>应用：计算字符串的长度（一个双字节字符长度计2，ASCII字符计1）</p>
<p>String.prototype.len=function(){return this.replace([^\x00-\xff]/g,&quot;aa&quot;).length;}</p>
<p>匹配空行的正则表达式：\n[\s| ]*\r</p>
<p>匹配HTML标记的正则表达式：/&lt;(.*)&gt;.*&lt;\/\1&gt;|&lt;(.*) \/&gt;/</p>
<p>匹配首尾空格的正则表达式：(^\s*)|(\s*$)</p>
<p>String.prototype.trim = function()<br />{<br />&nbsp;&nbsp;&nbsp; return this.replace(/(^\s*)|(\s*$)/g, &quot;&quot;);<br />}</p>
<p>利用正则表达式分解和转换IP地址：</p>
<p>下面是利用正则表达式匹配IP地址，并将IP地址转换成对应数值的Javascript程序：</p>
<p>function IP2V(ip)<br />{<br />&nbsp;re=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g&nbsp; //匹配IP地址的正则表达式<br />if(re.test(ip))<br />{<br />return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1<br />}<br />else<br />{<br />&nbsp;throw new Error(&quot;Not a valid IP address!&quot;)<br />}<br />}</p>
<p>不过上面的程序如果不用正则表达式，而直接用split函数来分解可能更简单，程序如下：</p>
<p>var ip=&quot;10.100.20.168&quot;<br />ip=ip.split(&quot;.&quot;)<br />alert(&quot;IP值是：&quot;+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))<br />符号解释：</p>
<p>字符 <br />描述</p>
<p>\ <br />将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如，'n' 匹配字符 &quot;n&quot;。'\n' 匹配一个换行符。序列 '\\' 匹配 &quot;\&quot; 而 &quot;\(&quot; 则匹配 &quot;(&quot;。</p>
<p>^ <br />匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性，^ 也匹配 '\n' 或 '\r' 之后的位置。</p>
<p>$ <br />匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性，$ 也匹配 '\n' 或 '\r' 之前的位置。</p>
<p>* <br />匹配前面的子表达式零次或多次。例如，zo* 能匹配 &quot;z&quot; 以及 &quot;zoo&quot;。* 等价于{0,}。</p>
<p>+ <br />匹配前面的子表达式一次或多次。例如，'zo+' 能匹配 &quot;zo&quot; 以及 &quot;zoo&quot;，但不能匹配 &quot;z&quot;。+ 等价于 {1,}。</p>
<p>? <br />匹配前面的子表达式零次或一次。例如，&quot;do(es)?&quot; 可以匹配 &quot;do&quot; 或 &quot;does&quot; 中的&quot;do&quot; 。? 等价于 {0,1}。</p>
<p>{n} <br />n 是一个非负整数。匹配确定的 n 次。例如，'o{2}' 不能匹配 &quot;Bob&quot; 中的 'o'，但是能匹配 &quot;food&quot; 中的两个 o。</p>
<p>{n,} <br />n 是一个非负整数。至少匹配n 次。例如，'o{2,}' 不能匹配 &quot;Bob&quot; 中的 'o'，但能匹配 &quot;foooood&quot; 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。</p>
<p>{n,m} <br />m 和 n 均为非负整数，其中n &lt;= m。最少匹配 n 次且最多匹配 m 次。例如，&quot;o{1,3}&quot; 将匹配 &quot;fooooood&quot; 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。</p>
<p>? <br />当 该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时，匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串，而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如，对于字符串 &quot;oooo&quot;，'o+?' 将匹配单个 &quot;o&quot;，而 'o+' 将匹配所有 'o'。</p>
<p>. <br />匹配除 &quot;\n&quot; 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符，请使用象 '[.\n]' 的模式。</p>
<p>(pattern) <br />匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到，在VBScript 中使用 SubMatches 集合，在JScript 中则使用 $0&hellip;$9 属性。要匹配圆括号字符，请使用 '\(' 或 '\)'。</p>
<p>(?:pattern) <br />匹 配 pattern 但不获取匹配结果，也就是说这是一个非获取匹配，不进行存储供以后使用。这在使用 &quot;或&quot; 字符 (|) 来组合一个模式的各个部分是很有用。例如， 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。</p>
<p>(?=pattern) <br />正向预查，在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配，也就是说，该匹配不需要获取供以后使用。例如，'Windows (?=95|98|NT|2000)' 能匹配 &quot;Windows 2000&quot; 中的 &quot;Windows&quot; ，但不能匹配 &quot;Windows 3.1&quot; 中的 &quot;Windows&quot;。预查不消耗字符，也就是说，在一个匹配发生后，在最后一次匹配之后立即开始下一次匹配的搜索，而不是从包含预查的字符之后开始。</p>
<p>(?!pattern) <br />负 向预查，在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配，也就是说，该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 &quot;Windows 3.1&quot; 中的 &quot;Windows&quot;，但不能匹配 &quot;Windows 2000&quot; 中的 &quot;Windows&quot;。预查不消耗字符，也就是说，在一个匹配发生后，在最后一次匹配之后立即开始下一次匹配的搜索，而不是从包含预查的字符之后开始</p>
<p>x|y <br />匹配 x 或 y。例如，'z|food' 能匹配 &quot;z&quot; 或 &quot;food&quot;。'(z|f)ood' 则匹配 &quot;zood&quot; 或 &quot;food&quot;。</p>
<p>[xyz] <br />字符集合。匹配所包含的任意一个字符。例如， '[abc]' 可以匹配 &quot;plain&quot; 中的 'a'。</p>
<p>[^xyz] <br />负值字符集合。匹配未包含的任意字符。例如， '[^abc]' 可以匹配 &quot;plain&quot; 中的'p'。</p>
<p>[a-z] <br />字符范围。匹配指定范围内的任意字符。例如，'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。</p>
<p>[^a-z] <br />负值字符范围。匹配任何不在指定范围内的任意字符。例如，'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。</p>
<p>\b <br />匹配一个单词边界，也就是指单词和空格间的位置。例如， 'er\b' 可以匹配&quot;never&quot; 中的 'er'，但不能匹配 &quot;verb&quot; 中的 'er'。</p>
<p>\B <br />匹配非单词边界。'er\B' 能匹配 &quot;verb&quot; 中的 'er'，但不能匹配 &quot;never&quot; 中的 'er'。</p>
<p>\cx <br />匹配由 x 指明的控制字符。例如， \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则，将 c 视为一个原义的 'c' 字符。</p>
<p>\d <br />匹配一个数字字符。等价于 [0-9]。</p>
<p>\D <br />匹配一个非数字字符。等价于 [^0-9]。</p>
<p>\f <br />匹配一个换页符。等价于 \x0c 和 \cL。</p>
<p>\n <br />匹配一个换行符。等价于 \x0a 和 \cJ。</p>
<p>\r <br />匹配一个回车符。等价于 \x0d 和 \cM。</p>
<p>\s <br />匹配任何空白字符，包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。</p>
<p>\S <br />匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。</p>
<p>\t <br />匹配一个制表符。等价于 \x09 和 \cI。</p>
<p>\v <br />匹配一个垂直制表符。等价于 \x0b 和 \cK。</p>
<p>\w <br />匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。</p>
<p>\W <br />匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。</p>
<p>\xn <br />匹配 n，其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如，'\x41' 匹配 &quot;A&quot;。'\x041' 则等价于 '\x04' &amp; &quot;1&quot;。正则表达式中可以使用 ASCII 编码。.</p>
<p>\num <br />匹配 num，其中 num 是一个正整数。对所获取的匹配的引用。例如，'(.)\1' 匹配两个连续的相同字符。</p>
<p>\n <br />标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n 个获取的子表达式，则 n 为向后引用。否则，如果 n 为八进制数字 (0-7)，则 n 为一个八进制转义值。</p>
<p>\nm <br />标 识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式，则 nm 为向后引用。如果 \nm 之前至少有 n 个获取，则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足，若 n 和 m 均为八进制数字 (0-7)，则 \nm 将匹配八进制转义值 nm。</p>
<p>\nml <br />如果 n 为八进制数字 (0-3)，且 m 和 l 均为八进制数字 (0-7)，则匹配八进制转义值 nml。</p>
<p>\un <br />匹配 n，其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如， \u00A9 匹配版权符号 (?)。</p>
<script type="text/javascript"><!--
google_ad_client = "pub-1634561494151585";
/* 468x60, articlebottom */
google_ad_slot = "7716109916";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
<script type="text/javascript">window.google_render_ad();</script>]]></description>
		</item>
		
</channel>
</rss>