<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>AspNet on 冯威的博客</title><link>https://fwhyy.com/tags/aspnet/</link><description>Recent content in AspNet on 冯威的博客</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Wed, 16 Sep 2015 00:00:00 +0800</lastBuildDate><atom:link href="https://fwhyy.com/tags/aspnet/atom.xml" rel="self" type="application/rss+xml"/><item><title>在Windows Server2008R2中部署WebAPI</title><link>https://fwhyy.com/2015/09/deploy-webapi-in-windows-server2008/</link><pubDate>Wed, 16 Sep 2015 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2015/09/deploy-webapi-in-windows-server2008/</guid><description>&lt;p&gt;一直以来都是在win8或windows server2012中进行asp.net mvc或webapi程序的部署，没有发现任何问题。今天在win2008中进行asp.net webapi的部署，访问api的时候页面显示404错误。下面步骤将解决asp.net webapi在win2008中的部署问题。&lt;/p&gt;</description></item><item><title>Asp.Net正在中止线程引发的问题</title><link>https://fwhyy.com/2013/11/aspnet-stoped-thread-method/</link><pubDate>Fri, 22 Nov 2013 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2013/11/aspnet-stoped-thread-method/</guid><description>&lt;p&gt;Asp.Net做的一个同步程序，同步的方法是通过JQuery的Ajax调用，同步过程大概要执行20多分钟，程序部署到服务器后执行一段时间后就弹出执行失败的对话框，日志记录的错误信息是“正在中止线程”。&lt;/p&gt;
&lt;h2 id="查错过程"&gt;查错过程：&lt;/h2&gt;
&lt;p&gt;1、根据“AspNet 正在中止线程“进行搜索，得到的结果基本都是跟”Response.End“有关的，但我的代码中没有Response.End，所以基本可以排除；&lt;/p&gt;
&lt;p&gt;2、因为使用JQuery的Ajax，所以猜想会不会是因为Ajax超时导致，修改代码将返回状态弹出：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201290809786.webp" alt="3cefded1gw1eatnxducbjj20k0051dg8" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;发现返回的status为”error“，也尝试过将timeout设置为一个较大值，发现问题依然存在，所以可以排除是JQuery Ajax超时；&lt;/p&gt;
&lt;p&gt;3、使用Fiddler2进行监控，发现执行一段时间后报了500错误，显示的错误详细信息如下图：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201290809600.webp" alt="3cefded1gw1eatnxcw1mrj20f607st9e" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;到了这一步就好办了，可以知道是httpRuntime超时了，配置Webconfig就可以了，如下图：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201290809727.webp" alt="3cefded1gw1eatnxep1sfj20gb031wet" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;设置好好后发不到服务器，再次运行程序，问题解决。&lt;/p&gt;
&lt;p&gt;奇怪的是在本机运行的时候即使没有设置executionTimeout也不会出现问题，原因是在本机的Webconfig中的compilation节点的有个debug属性设置为true，发布后的Webconfig中的compilation没有debug节点，当debug属性为false时，httpRuntime的executionTimeout属性才会生效。&lt;/p&gt;</description></item><item><title>在Asp.Net中使用jQueryEasyUI</title><link>https://fwhyy.com/2012/11/using-jqueryeasyui-in-aspnet/</link><pubDate>Sun, 25 Nov 2012 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2012/11/using-jqueryeasyui-in-aspnet/</guid><description>&lt;h2 id="前言"&gt;前言&lt;/h2&gt;
&lt;p&gt;最近做一个小工具，列表显示页面准备使用jQuery的UI框架，因为之前知道有jQWidgets这个框架,所以直接就下载下来使用了,&lt;a href="http://www.jqwidgets.com/"&gt;jQWidgets&lt;/a&gt;的功能很强大,Demo和文档也非常详细,但使用后发现有几个问题就果断放弃了使用jQWidgets:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;页面加载速度比较慢&lt;/li&gt;
&lt;li&gt;当列表字段过多出现横向滚动条时,拖动滚动条非常卡(在IE下都很卡,Chrome好点)&lt;/li&gt;
&lt;li&gt;分页取数稍显麻烦,也可能是我没研究透。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;经过一番比较选择了&lt;a href="http://www.jeasyui.com/"&gt;jQueryEasUI&lt;/a&gt;，目前最新版本为1.3.1：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.jeasyui.com/download/index.php"&gt;官方下载&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.jeasyui.com/demo/main/index.php"&gt;官方演示&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.jeasyui.com/documentation/index.php"&gt;官方文档&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;其实是用类似的框架，看看官网的文档也就OK了，本文是我最近是用jQueryEasyUI的一个总结，也可以让初使用jQueryEasyUI的朋友少走弯路。&lt;/p&gt;
&lt;h2 id="下载引用"&gt;下载引用&lt;/h2&gt;
&lt;p&gt;下载后解压的文件目录如下图：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201290653234.webp" alt="2012-11-22_212942" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;demo：JQueryEasyUI的一些示例页面，在项目使用可以将该目录删除&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;locale：该目录中是一些本地化文件，用来支持不同的语言，如中文可以引用其中的easyui-lang-zh_CN.js&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;plugins和src：这两个目录中是支持JQueryEasyUI各种功能的js文件&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;themes：主题目录，目录中有三种主题，default、gray和metro，另外还有一个icons目录和icon.css，在页面使用引用icon.css即可。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;使用jQueryEasyUI需要引用四个文件，两个css和两个js文件：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;link rel=&amp;#34;stylesheet&amp;#34; type=&amp;#34;text/css&amp;#34; href=&amp;#34;../Scripts/jqueryeasyui/themes/gray/easyui.css&amp;#34; /&amp;gt;
&amp;lt;link rel=&amp;#34;stylesheet&amp;#34; type=&amp;#34;text/css&amp;#34; href=&amp;#34;../Scripts/jqueryeasyui/themes/icon.css&amp;#34; /&amp;gt;
&amp;lt;script type=&amp;#34;text/javascript&amp;#34; src=&amp;#34;../Scripts/jqueryeasyui/jquery-1.8.0.min.js&amp;#34;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&amp;#34;text/javascript&amp;#34; src=&amp;#34;../Scripts/jqueryeasyui/jquery.easyui.min.js&amp;#34;&amp;gt;&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;如果需要使用本地化 还需要引用：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;script type=&amp;#34;text/javascript&amp;#34; src=&amp;#34;../Scripts/jqueryeasyui/locale/easyui-lang-zh_CN.js&amp;#34;&amp;gt;&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="jqueryeasyui-grid的分页"&gt;jQueryEasyUI Grid的分页&lt;/h2&gt;
&lt;p&gt;根据官网的文档可以很容易的构建Grid，期初我没有引用本地化文件easyui-lang-zh_CN.js，列表的分页栏显示出来是英文的，在网上查阅后得知可以用代码的方式重新构建分页栏：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;//设置分页控件 var p = $(&amp;#39;#dg&amp;#39;).datagrid(&amp;#39;getPager&amp;#39;);
$(p).pagination({
 pageSize: 10, //每页显示的记录条数，默认为10 
 pageList: [10, 20, 30, 40, 50], //可以设置每页记录条数的列表 beforePageText: &amp;#39;第&amp;#39;, //页数文本框前显示的汉字 
 afterPageText: &amp;#39;页 共 {pages} 页&amp;#39;,
 displayMsg: &amp;#39;当前显示 {from} - {to} 条记录 共 {total} 条记录&amp;#39;
 /*onBeforeRefresh:function(){ $(this).pagination(&amp;#39;loading&amp;#39;); 
 alert(&amp;#39;before refresh&amp;#39;); $(this).pagination(&amp;#39;loaded&amp;#39;); }*/
});
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;后来发现只需要引用本地化文件easyui-lang-zh_CN.js后分页栏就自动显示为中文了。引用本地化文件还可以解决日历控件格式的问题，所以如果是做中文系统建议还是在页面中引用本地化文件。&lt;/p&gt;
&lt;h2 id="jqueryeasyui控件的取值"&gt;jQueryEasyUI控件的取值&lt;/h2&gt;
&lt;p&gt;使用JQuery取控件的值很简单，如下：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$(&amp;#34;#CstName&amp;#34;).val();
$(&amp;#34;#TaskNo&amp;#34;).val(),
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;如果要使用jQueryEasyUI的日历控件、下拉控件或其他的一些控件，给普通的input、select控件添加一个class即可：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;input id=&amp;#34;FeedBackDate&amp;#34; name=&amp;#34;FeedBackDate&amp;#34; class=&amp;#34;easyui-datebox&amp;#34; maxlength=&amp;#34;10&amp;#34;
 style=&amp;#34;width: 150px;&amp;#34; /&amp;gt;
&amp;lt;select id=&amp;#34;IsKfCl&amp;#34; class=&amp;#34;easyui-combobox&amp;#34; name=&amp;#34;IsKfCl&amp;#34; style=&amp;#34;width:150px;&amp;#34;&amp;gt; 
 &amp;lt;option value=&amp;#34;&amp;#34;&amp;gt;&amp;lt;/option&amp;gt; 
 &amp;lt;option value=&amp;#34;是&amp;#34;&amp;gt;是&amp;lt;/option&amp;gt; 
 &amp;lt;option value=&amp;#34;否&amp;#34;&amp;gt;否&amp;lt;/option&amp;gt; 
&amp;lt;/select&amp;gt; 
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;现在取这些控件的值需要使用下面的方法：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$(&amp;#34;#FeedBackDate&amp;#34;).datebox(&amp;#34;getValue&amp;#34;);
$(&amp;#34;#IsKfCl&amp;#34;).combobox(&amp;#34;getValue&amp;#34;);
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="grid-toolbar的两种方式"&gt;Grid ToolBar的两种方式&lt;/h2&gt;
&lt;p&gt;通常在Grid列表控件的上方会添加一些按钮如：新增、编辑、删除等，如下面效果：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201290653327.webp" alt="2012-11-25_144045_thumb" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;在jQueryEasyUI中可以使用ToolBar来实现，ToolBar可以在DataGrid初始化时定义，如下：&lt;/p&gt;</description></item><item><title>在VS中查看文件是谁签出的</title><link>https://fwhyy.com/2011/08/in-vs-view-who-file-is-checked-out/</link><pubDate>Sat, 20 Aug 2011 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2011/08/in-vs-view-who-file-is-checked-out/</guid><description>&lt;p&gt;最近的项目使用的源码管理器是VSS，有时候你想修改的文件被别人签出了，所以我们需要知道该文件是被谁签出了，好及时和他沟通。我原来的做法都是直接进入VSS管理器中进行查看，但这样很麻烦，每次都要打开VSS管理器。其实可以在VS中进行简单的设置就可以了，步骤如下：&lt;/p&gt;
&lt;p&gt;1 在VS中的菜单上单击鼠标右键，然后选择显示“源代码管理”&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300706197.webp" alt="2011-08-13_160609" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;2 选中要查看的文件后，在源代码管理中单击“属性”&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300706261.webp" alt="2011-08-13_160643" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;3 打开第2个标签页“Check Out Status”，可以看到签出人等信息。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300706850.webp" alt="2011-08-13_160833" loading="lazy" decoding="async"&gt;
&lt;/p&gt;</description></item><item><title>使用MicroSoft CLR Debug来调试较大项目</title><link>https://fwhyy.com/2011/07/use-microsoft-clr-debug-to-debug-larger-projects/</link><pubDate>Wed, 20 Jul 2011 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2011/07/use-microsoft-clr-debug-to-debug-larger-projects/</guid><description>&lt;p&gt;在以前的开发中，调试时很自然的会直接按F5进行调试，有时项目部署在IIS中也只是将项目的服务器指向IIS，仍然是将整个项目运行设置断点进行调试。最近遇到了一个问题，项目很大，直接F5运行会导致VS卡死，这种时候使用MicroSoft CLR Debug来进行调试是最合适不过了。&lt;/p&gt;
&lt;p&gt;首先打开MicroSoft CLR Debug&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201290710632.webp" alt="2011-07-18_164829" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;打开后界面如下&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201290710108.webp" alt="2011-07-18_164908" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;从项目中选择一个需要调试的文件，并在需要调试的地方设置断点&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201290710393.webp" alt="2011-07-18_165017" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;选择“调试”-“附加到进程”&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201290710454.webp" alt="2011-07-18_165041" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;附加进程前确保你的项目已经运行，如果是Win2003系统，会有一个w3wp.exe的进程存在,如果是xp系统，该进程名是aspnet_wp.exe。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201290710503.webp" alt="2011-07-18_165126" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;此时运行程序就会命中断点，个人认为此方法比较适用于将项目部署到IIS中进行调试，此方法的几个优点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;不会占用很多资源，只需要将需要调试的文件添加进来设置断点即可。&lt;/li&gt;
&lt;li&gt;如果是管理系统之类的项目，只需要登陆一次即可，不需要每次调试时都重新登陆。&lt;/li&gt;
&lt;li&gt;退出调试不会对运行的程序有什么影响，如果是F5进行调试，退出调试页面就关闭了。&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>未在本地计算机上注册“Microsoft.Jet.OleDb.4.0”提供程序 错误解决</title><link>https://fwhyy.com/2011/06/not-registered-on-the-local-computer-microsoft-jet-oledb-4/</link><pubDate>Wed, 15 Jun 2011 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2011/06/not-registered-on-the-local-computer-microsoft-jet-oledb-4/</guid><description>&lt;p&gt;最近在做一个导入Excel数据到数据库的程序出现了如下错误：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201301558041.webp" alt="2011-06-15_1552061" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h2 id="运行环境"&gt;运行环境&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;数据库：SqlServer2008 R2&lt;/li&gt;
&lt;li&gt;OS：Windows Server 2008 R2&lt;/li&gt;
&lt;li&gt;IIS：IIS7&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="解决方法"&gt;解决方法&lt;/h2&gt;
&lt;p&gt;在应用程序对用的应用程序池的高级设置中设置“启用32位应用程序”为“True”&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201301558286.webp" alt="2011-06-15_155851" loading="lazy" decoding="async"&gt;
&lt;/p&gt;</description></item><item><title>在VS2010中将AspNet网站编译成一个DLL</title><link>https://fwhyy.com/2011/04/aspnet-website-compiled-into-a-dll-in-vs2010/</link><pubDate>Wed, 06 Apr 2011 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2011/04/aspnet-website-compiled-into-a-dll-in-vs2010/</guid><description>&lt;p&gt;在VS2010中创建一个网站，部署时网站的dll是动态生成的，每次编译产生的dll的名称都不一样，这样会导致在部署时必须将aspx页面和dll一起部署，尽管有时你可能只修改了后台代码。这样就变得很不方便，在VS2010中可以借助一个插件是网站生成一个固定名称的dll。&lt;/p&gt;
&lt;p&gt;1 从下面的链接地址中下载 Visual Studio® 2010 Web Deployment Projects&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.microsoft.com/downloads/en/confirmation.aspx?FamilyID=711a2eef-b107-4784-9063-c978edc498cd&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/en/confirmation.aspx?FamilyID=711a2eef-b107-4784-9063-c978edc498cd&amp;amp;displaylang=en&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;2 安装Visual Studio® 2010 Web Deployment Projects插件，然后再网站项目上点击右键，可以看到多了一项Add Web Deployment Project&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201290807175.webp" alt="2011-04-06_113023" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;3 点击Add Web Deployment Project，弹出如下对话框&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201290807160.webp" alt="2011-04-06_113422" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;4 名称和路径可以修改，一般默认就好，点击OK，在解决方案中会生成一个部署项目&lt;/p&gt;
&lt;p&gt;5 在部署项目点击右键，点击“生成”&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201290807093.webp" alt="2011-04-06_113814" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;6 生成成功后，在部署项目的目录中会产生一个Release目录，Release目录中就是项目发布的所有文件，在bin目录中可以看到并没有之前那样有很多不规则命名的dll，生成的dll的名称和前面添加部署项目时所填写的名称相同，为EduAppWeb_deploy&lt;/p&gt;</description></item><item><title>Asp.Net站点整合Discuz论坛实现同步注册和单点登录</title><link>https://fwhyy.com/2011/04/aspnet-site-integration-discuz-bbs-sync-reg-and-sso/</link><pubDate>Fri, 01 Apr 2011 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2011/04/aspnet-site-integration-discuz-bbs-sync-reg-and-sso/</guid><description>&lt;p&gt;最近在一个小站中整合了Discuz论坛，查阅了些资料后实现了同步注册和单点登录。&lt;/p&gt;
&lt;p&gt;Discuz是以虚拟目录的方式加载网站中，整合Discuz到网站中进行安装要注意一下几个问题：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201292105539.webp" alt="2011-04-01_163915" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Discuz所在的目录需要添加NETWORK SERVICE 和IIS_User这两个账户的权限。&lt;/li&gt;
&lt;li&gt;Discuz根目录下的DNT.config文件需要修改，将&lt;Forumpath&gt;/&lt;/Forumpath&gt;修改为&lt;Forumpath&gt;/BBS/&lt;/Forumpath&gt;，BBS为虚拟目录的名称。&lt;/li&gt;
&lt;li&gt;由于我网站用了第三方的控件，在webconfig文件中进行了相关设置，然后在访问论坛时提示缺少程序集的引用，后来把第三方控件的dll加到Discuz下的bin目录中得以解决。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;下面说说怎样实现同步注册和单点登录&lt;/p&gt;
&lt;p&gt;其实在研究后发现很简单，当然我现在做的只是同域的情况下，跨域的情况还没研究，估计也不会很难，应该只是多了一个设置cookieDomain的过程。Discuz给我们提供了一个DiscuzToolkit的工具包，提供了很多API供调用，下面就一步步来吧。&lt;/p&gt;
&lt;p&gt;1 安装好Discuz论坛后，进入后台管理，选择扩展-》通行证设置-》添加整合程序设置&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;应用程序名称：可以随便输入&lt;/li&gt;
&lt;li&gt;应用程序Url地址：我填写的是我站点的地址&lt;/li&gt;
&lt;li&gt;登录完成后返回地址：同上&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;2 记下生成的APIKey和密匙，在后面的代码编写中会用到&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2011/2011-04-01_164204.webp" alt="2011-04-01_164204" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;3 我将APIKey，密匙都配置在了webconfig文件中&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201292106145.webp" alt="2011-04-01_164509" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;APIKey：value值为后台生成的APIKey&lt;/li&gt;
&lt;li&gt;Secret：value值为后台生成的密匙&lt;/li&gt;
&lt;li&gt;Url：value值为BBS的路径&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;4 写一个公共的BBSHelper类，将添加用户，登录，改密码等方法封装在里面。注意要引用命名空间Discuz.Toolkit&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;/// &amp;lt;summary&amp;gt;
/// 同步Discuz论坛帮助类
/// &amp;lt;/summary&amp;gt;
public class DiscuzBBSHelper
{
 private string _apiKey = string.Empty;
 private string _secret = string.Empty;
 private string _url = string.Empty;
 DiscuzSession _ds;

 public DiscuzBBSHelper()
 {
 _apiKey = ConfigHelper.APIKey();
 _secret = ConfigHelper.Secret();
 _url = ConfigHelper.Url();
 _ds = new DiscuzSession(_apiKey, _secret, _url);
 }

 /// &amp;lt;summary&amp;gt;
 /// 登录
 /// &amp;lt;/summary&amp;gt;
 public void Login(string userName,string pwd)
 {
 int uid = _ds.GetUserID(userName);
 _ds.Login(uid, pwd, false, 100, &amp;#34;&amp;#34;);
 }

 /// &amp;lt;summary&amp;gt;
 /// 登出
 /// &amp;lt;/summary&amp;gt;
 public void Logout()
 {
 _ds.Logout(&amp;#34;&amp;#34;);
 _ds.session_info = null;
 HttpContext.Current.Session[&amp;#34;AuthToken&amp;#34;] = null;
 }

 /// &amp;lt;summary&amp;gt;
 /// 创建用户
 /// &amp;lt;/summary&amp;gt;
 public void AddUser(string userName,string pwd)
 {
 _ds.Register(userName, pwd, &amp;#34;&amp;#34;, false);
 }

 /// &amp;lt;summary&amp;gt;
 /// 修改密码
 /// &amp;lt;/summary&amp;gt;
 public void ChangePWD(string userName,string oldPWD,string newPWD)
 {
 int uid = _ds.GetUserID(userName);
 _ds.ChangeUserPassword(uid, oldPWD, newPWD, newPWD, &amp;#34;&amp;#34;);
 }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;5 在网站需要的地方调用该类中的方法即可，如下：&lt;/p&gt;</description></item><item><title>Excel导入数据库出现“外部表不是预期的格式”错误的解决方法</title><link>https://fwhyy.com/2011/03/excel-import-database-external-table-is-not-desired-format-mistakes-of-the-solution/</link><pubDate>Tue, 08 Mar 2011 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2011/03/excel-import-database-external-table-is-not-desired-format-mistakes-of-the-solution/</guid><description>&lt;p&gt;下图为出错的界面&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300645078.webp" alt="20110308001" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;出错的原因是因为Excel的格式不是标准的Excel格式，像我出现这个错误的原因就是使用的Excel是用程序导出的Excel。&lt;/p&gt;
&lt;p&gt;解决此问题方法很简单：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;将格式不标准的Excel另存为一个标准格式。&lt;/li&gt;
&lt;li&gt;如果Excel是用程序导出的，可以修改导出程序，将其导出为标准格式。&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>解决AspNet中DataGrid GridView等列表控件导出Excel长数字显示成科学计数法的问题</title><link>https://fwhyy.com/2011/01/solve-gridview-long-export-excel-such-as-digital-display/</link><pubDate>Sun, 23 Jan 2011 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2011/01/solve-gridview-long-export-excel-such-as-digital-display/</guid><description>&lt;p&gt;大家都知道，在Excel中，当一个单元格中的值为一长串数字，而且该单元格又不是文本格式的时候，这一长串数字会以科学计数法的方式显示，这给我们的阅读带来了障碍。如果是直接在Excel中编辑数据，手动将格式改为“文本”即可，但要是用程序导出的Excel，手动去改就显得很麻烦了。简单的方法就是在程序中导出Excel的时候就设置列为“文本”格式。&lt;/p&gt;
&lt;p&gt;AspNet中将DataGrid，GridView等列表控件导出Excel的代码通常如下：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;DataSet ds = GetData();
this.GridView1.DataSource = ds;
GridView1.DataBind();

//导出Excel的方法
Export(GridView1, &amp;#34;mayfile.xls&amp;#34;, &amp;#34;application/ms-excel&amp;#34;);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;现在只需在调用导出Excel方法前对GridView中的列进行设置即可，代码如下：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;DataSet ds = GetData();
this.GridView1.DataSource = ds;
GridView1.DataBind();

for (int i = 0; i &amp;lt; GridView1.Rows.Count; i++)
{
 for (int j = 0; j &amp;lt; GridView1.Columns.Count; j++)
 {
 GridView1.Rows[i].Cells[j].Attributes.Add(&amp;#34;style&amp;#34;, &amp;#34;vnd.ms-excel.numberformat:@&amp;#34;);
 }
}

//导出Excel的方法
Export(GridView1, &amp;#34;mayfile.xls&amp;#34;, &amp;#34;application/ms-excel&amp;#34;);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;上面的代码是将GridView中所有的列都设置成了文本格式，你也可以根据需要对指定的几列进行设置。&lt;/p&gt;</description></item><item><title>jQuery boxy插件的确认框在AspNet中的应用</title><link>https://fwhyy.com/2010/11/use-jquery-boxy-plug-in-confirmation-box-in-the-aspnet/</link><pubDate>Sat, 20 Nov 2010 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2010/11/use-jquery-boxy-plug-in-confirmation-box-in-the-aspnet/</guid><description>&lt;p&gt;jQuery有不少弹出框的插件，boxy应该算的上是功能和效果都还不错的一款了。先来看一张效果图吧。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201290715574.webp" alt="2010-11-20_134247" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;在Web开发中经常会使用到Alert和Confirm弹出框，在Asp.Net中的删除按钮上我们常常会加上删除的确认提示，以避免误删除数据，就像上面图片那样。我们一般会写出这样的代码。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;html xmlns=&amp;#34;http://www.w3.org/1999/xhtml&amp;#34; &amp;gt;
&amp;lt;head runat=&amp;#34;server&amp;#34;&amp;gt;
 &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;
 &amp;lt;script type=&amp;#34;text/javascript&amp;#34;&amp;gt;
 function confirmDel() {
 return confirm(&amp;#34;您确认要删除吗？&amp;#34;);
 }
 &amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
 &amp;lt;form id=&amp;#34;form1&amp;#34; runat=&amp;#34;server&amp;#34;&amp;gt;
 &amp;lt;asp:Button ID=&amp;#34;btnDel&amp;#34; runat=&amp;#34;server&amp;#34; 
 OnClientClick=&amp;#34;return confirmDel();&amp;#34; Text=&amp;#34;删除&amp;#34; /&amp;gt;
 &amp;lt;/form&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;上面的代码很简单，confirm弹出框会有两个按钮，点击确定返回true，点击取消返回false。在boxy插件中也有confirm方法，调用代码如下：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$(document).ready(function() {
 $(&amp;#34;#btnDel&amp;#34;).click(function() {
 Boxy.confirm(&amp;#34;您确认要删除吗？&amp;#34;, function() { }, null);
 return false;
 });
});
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Boxy的confirm方法有三个参数分别是确认信息内容，弹出框点击确定的回调函数，一些设置项比如标题。上面的代码中如果不加上return false，那么弹出框会闪现，然后删除按钮的后天事件还是执行了。加上return false，那么不管是点击确定还是取消都不会执行后台事件，这显然达不到我们的要求，看来只能打点击确定后的回调函数的主意了。可以在一个公用的js文件中将Boxy的confirm封装一下：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201290716976.webp" alt="2010-11-20_140830" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;页面的调用代码如下：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$(document).ready(function() {
 $(&amp;#34;#Button1&amp;#34;).click(function() { return confirmO(this, &amp;#34;您确认删除吗？&amp;#34;) });

});
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;经过这样修改后，但点击弹出框的确定按钮时就会执行服务器事件了。&lt;/p&gt;</description></item><item><title>让 ASP.NET Menu 控件在 Google Chrome 浏览器上正常运行</title><link>https://fwhyy.com/2010/11/let-the-aspnet-menu-controls-on-the-google-chrome-browser-run-normally/</link><pubDate>Thu, 11 Nov 2010 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2010/11/let-the-aspnet-menu-controls-on-the-google-chrome-browser-run-normally/</guid><description>&lt;p&gt;最近在帮朋友做一管理系统，里面用到了Asp.Net的Menu控件，由于我的Chrome浏览器为默认，运行后发现二级菜单不能正常出来，网上查到解决方法是在项目中创建一个Others.browser文件，文件代码如下：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;browsers&amp;gt;
 &amp;lt;browser id=&amp;#34;Safari3&amp;#34; parentID=&amp;#34;Safari1Plus&amp;#34;&amp;gt;
 &amp;lt;identification&amp;gt;
 &amp;lt;userAgent match=&amp;#34;Safari/\d+\.\d+&amp;#34; /&amp;gt;
 &amp;lt;/identification&amp;gt;
 &amp;lt;capture&amp;gt;
 &amp;lt;userAgent match=&amp;#34;Version/(?&amp;#39;version&amp;#39;\d+\.\d+)&amp;#34; /&amp;gt;
 &amp;lt;/capture&amp;gt;
 &amp;lt;capabilities&amp;gt;
 &amp;lt;capability name=&amp;#34;browser&amp;#34; value=&amp;#34;Safari3&amp;#34; /&amp;gt;
 &amp;lt;capability name=&amp;#34;version&amp;#34; value=&amp;#34;${version}&amp;#34; /&amp;gt;
 &amp;lt;/capabilities&amp;gt;
 &amp;lt;controlAdapters&amp;gt;
 &amp;lt;adapter controlType=&amp;#34;System.Web.UI.WebControls.Menu&amp;#34;
 adapterType=&amp;#34;&amp;#34; /&amp;gt;
 &amp;lt;/controlAdapters&amp;gt;
 &amp;lt;/browser&amp;gt;
 &amp;lt;browser id=&amp;#34;GoogleChrome&amp;#34; parentID=&amp;#34;Safari3&amp;#34;&amp;gt;
 &amp;lt;identification&amp;gt;
 &amp;lt;userAgent match=&amp;#34;Chrome/(?&amp;#39;version&amp;#39;\d+\.\d+)&amp;#34; /&amp;gt;
 &amp;lt;/identification&amp;gt;
 &amp;lt;capabilities&amp;gt;
 &amp;lt;capability name=&amp;#34;browser&amp;#34; value=&amp;#34;Googlebot&amp;#34; /&amp;gt;
 &amp;lt;/capabilities&amp;gt;
 &amp;lt;/browser&amp;gt;
&amp;lt;/browsers&amp;gt;
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>WebService生成客户端代理的工具WSDL参数介绍</title><link>https://fwhyy.com/2010/08/webservice-to-generate-the-client-proxy-tool-wsdl-parameters-is-introduced/</link><pubDate>Tue, 10 Aug 2010 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2010/08/webservice-to-generate-the-client-proxy-tool-wsdl-parameters-is-introduced/</guid><description>&lt;h2 id="wsdlexe"&gt;wsdl.exe&lt;/h2&gt;
&lt;p&gt;使用 ASP.NET，根据 WSDL 协定文件、XSD 架构和 .disc 发现文档，为 Xml Web Services 客户端和 Xml Web Ser 代码的实用工具。此工具可以与 disco.exe 一起使用。&lt;/p&gt;
&lt;p&gt;wsdl.exe &amp;lt;选项&amp;gt; &amp;lt;URL 或路径&amp;gt; &amp;lt;URL 或路径&amp;gt;&lt;/p&gt;
&lt;h2 id="选项"&gt;选项&lt;/h2&gt;
&lt;p&gt;&amp;lt;URL 或路径&amp;gt; –
指向 WSDL 协定、XSD 架构或 .discomap 文档的 URL 或 /nologo 取消显示版权标志。&lt;/p&gt;
&lt;p&gt;/language:&lt;language&gt;
用于生成的代理类的语言。请从“CS”、“VB”、“JS”、“CPP”中选择，或者为实现System.CodeDom.Compiler. 的类提供一个完全限定的名称。默认语言为“CS”(CShar )缩写形式为“/l:”。&lt;/p&gt;
&lt;p&gt;/sharetypes
打开类型共享功能。此功能针对不同服务之间共享 的相同类型(命名空间、名称和网络签名必须相同) 创建一个具有单一类型定义的代码文件。 请使用 http:// URLs 作为命令行参数来引用 服务，或为本地文件创建一个 discomap 文档。&lt;/p&gt;
&lt;p&gt;/verbose
指定 /sharetypes 开关时显示额外信息。 缩写形式为“/v”。&lt;/p&gt;
&lt;p&gt;/fields
生成字段而非属性。缩写形式为“/f”。&lt;/p&gt;
&lt;p&gt;/order
为粒子成员生成显式顺序标识符。&lt;/p&gt;
&lt;p&gt;/enableDataBinding
在所有生成的类型上实现 INotifyPropertyChanged 接口 以启用数据绑定。缩写形式为“/edb”。&lt;/p&gt;
&lt;p&gt;/namespace:&lt;namespace&gt;
生成的代理或模板的命名空间。默认命名空间 为全局命名空间。缩写形式为“/n:”。&lt;/p&gt;
&lt;p&gt;/out:&amp;lt;fileName|directoryPath&amp;gt;
生成的代理代码的文件名或目录路径。默认文件名是从 服务名派生的。缩写形式为“/o:”。&lt;/p&gt;
&lt;p&gt;/protocol:&lt;protocol&gt;
重写要实现的默认协议。请从“SOAP”、“SOAP12”、 “HttpGet”、“HttpPost”中选择。&lt;/p&gt;
&lt;p&gt;/username:&lt;username&gt;
/password:&lt;password&gt;
/domain:&lt;domain&gt;
连接到要求身份验证的服务器时使用的凭据。 缩写形式为“/u:”、“/p:”和“/d:”。&lt;/p&gt;
&lt;p&gt;/proxy:&lt;url&gt;
用来处理 HTTP 请求的代理服务器的 URL。 默认为使用系统代理服务器设置。&lt;/p&gt;
&lt;p&gt;/proxyusername:&lt;username&gt;
/proxypassword:&lt;password&gt;
/proxydomain:&lt;domain&gt;
连接到要求身份验证的代理服务器时使用的凭据。 缩写形式为“/pu:”、“/pp:”和“/pd:”。&lt;/p&gt;
&lt;p&gt;/appsettingurlkey:&lt;key&gt;
在代码生成中用来读取 URL 属性的 默认值的配置项。默认为不从配置 文件中读取。缩写形式为“/urlkey:”。&lt;/p&gt;
&lt;p&gt;/appsettingbaseurl:&lt;baseurl&gt;
计算 URL 段时使用的基 URL。 还必须指定 appsettingurlkey 选项。URL 段是 从 appsettingbaseurl 计算 WSDL 文档中的 URL 的相对 URL 的结果。&lt;/p&gt;</description></item><item><title>Net4.0—数据绑定控件（GridView ListView…）中的ClientIDRowSuffix属性</title><link>https://fwhyy.com/2010/07/net-4-data-bound-controls-the-clientidrowsuffix-properties/</link><pubDate>Fri, 30 Jul 2010 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2010/07/net-4-data-bound-controls-the-clientidrowsuffix-properties/</guid><description>&lt;p&gt;在AspNet4中的数据绑定控件（GridView ListView…）中新增了一个ClientIDRowSuffix属性，ClientIDRowSuffix属性可以影响数据绑定控件内部控件的ID，ClientIDRowSuffix控件的值可以设置为数据绑定控件的数据源的任何一列。值得注意的是ClientIDRowSuffix属性是和ClientIDMode属性配合使用的。ClientIDMode有四种属性值，这个在&lt;a href="http://blog.fwhyy.com/?p=18"&gt;Net4.0—对HTML净化的处理&lt;/a&gt;一文中有提到，下面介绍如何在数据绑定控件中使用ClientIDRowSuffix：&lt;/p&gt;
&lt;p&gt;1 在页面中放一个GridView控件，在控件添加一个模板列，模板列中添加一个Lable控件，ID设置为lblId，代码如下：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;asp:GridView ID=&amp;#34;GridView1&amp;#34; runat=&amp;#34;server&amp;#34;
 ClientIDRowSuffix=&amp;#34;UserId&amp;#34; ClientIDMode=&amp;#34;Predictable&amp;#34; &amp;gt;
 &amp;lt;Columns&amp;gt;
 &amp;lt;asp:TemplateField&amp;gt;
 &amp;lt;ItemTemplate&amp;gt;
 &amp;lt;asp:Label ID=&amp;#34;lblId&amp;#34; runat=&amp;#34;server&amp;#34;&amp;gt;&amp;lt;/asp:Label&amp;gt;
 &amp;lt;/ItemTemplate&amp;gt;
 &amp;lt;/asp:TemplateField&amp;gt;
 &amp;lt;/Columns&amp;gt;
&amp;lt;/asp:GridView&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;2 进入后台代码视图，添加一个User类做数据源用，在PageLoad事件中绑定GridView，代码如下：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;public partial class WebForm1 : System.Web.UI.Page
{
 protected void Page_Load(object sender, EventArgs e)
 {
 List&amp;lt;User&amp;gt; list = new List&amp;lt;User&amp;gt;
 {
 new User{UserId=10,UserName=&amp;#34;oec2003&amp;#34;},
 new User{UserId=20,UserName=&amp;#34;oec2004&amp;#34;}
 };
 if (!Page.IsPostBack)
 {
 this.GridView1.DataSource = list;
 this.GridView1.DataBind();
 }
 }
}
public class User
{
 public int UserId { get; set; }
 public string UserName { get; set; }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;3 设置GridView的属性ClientIDMode为不同值，运行程序查看源码，观察Lable控件的ID，如下图：&lt;/p&gt;
&lt;p&gt;AutoID&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300731399.webp" alt="2010-07-30_112500" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Inherit&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300731940.webp" alt="2010-07-30_112644" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Predictable&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300731460.webp" alt="2010-07-30_112747_thumb" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Static&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300732906.webp" alt="2010-07-30_112954" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h2 id="总结"&gt;总结&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;1 根据上图看以看出当ClientIDMode值为Predictable和Inherit时，ClientIDRowSuffix的设置才起了作用，将ClientIDRowSuffix设置的UserId字段的值拼接到了Lable控件的ID属性后。&lt;/li&gt;
&lt;li&gt;2 在网上的一些资料表明ClientIDRowSuffix属性要和ClientIDMode属性一起使用，并且ClientIDMode属性的值要设置成Predictable，但我将GridView中的ClientIDMode属性去掉后运行，看到的源码和设置ClientIDMode为Predictable得到的源码一致。也就是说只设置GrieView的ClientIDRowSuffix就可以得到想要的结果。&lt;/li&gt;
&lt;li&gt;3 ClientIDRowSuffix属性还可以设置对应多个字段，如ClientIDRowSuffix=”UserId,UserName”，这样得到的控件的ID是多个字段值的拼接。&lt;/li&gt;
&lt;li&gt;4 在AspNet4的数据绑定控件中，只有GridView和ListView有ClientIDRowSuffix属性。&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Net4.0—AspNet中的控件HyperLink的改进（支持路由跳转）</title><link>https://fwhyy.com/2010/07/net-4-aspnet-controls-the-hyperlink-in-the-improvement/</link><pubDate>Wed, 28 Jul 2010 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2010/07/net-4-aspnet-controls-the-hyperlink-in-the-improvement/</guid><description>&lt;p&gt;作过Web开发的人对HyperLink控件一定非常熟悉，在客户端生成的代码就是一个a标签。AspNet4中的Hyperlink控件相比以前的版本做了些改进，可以更好地支持URl重写，下面结合在&lt;a href="http://blog.fwhyy.com/?p=20"&gt;Net4.0—AspNet中URL重写的改进&lt;/a&gt;一文中的例子来讲解下Hyperlink这个新的功能。&lt;/p&gt;
&lt;p&gt;1 在项目中的Default.aspx页面中加入一个Hyperlink控件，在设计视图中右击该控件，选择属性，在属性窗口中选择Expresstions，如下图：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300729640.webp" alt="2010-07-27_172142" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;2 点击右边的三个小点点，在弹出的对话框中进行如下设置：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300729586.webp" alt="2010-07-27_172422" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;设置RouteName为productdetail，就是让该链接导向test.aspx页面，因为在Global.asax中设置名为productdetail的路由对应的物理文件时test.aspx。RouteValus就是配置参数项，此处的category和name也是在Global.asax中配置的。&lt;/p&gt;
&lt;p&gt;3 设置好后点击OK，切换到代码视图，可以看到代码如下：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;asp:HyperLink ID=&amp;#34;HyperLink1&amp;#34; runat=&amp;#34;server&amp;#34;
 NavigateUrl=&amp;#34;&amp;lt;%$ RouteUrl:RouteName=productdetail,category=computer,name=thinkpad %&amp;gt;&amp;#34;&amp;gt;
 Test Page&amp;lt;/asp:HyperLink&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;4 设置Default.aspx为起始页，按F5运行，点击链接Test Page链接，会跳转到test.aspx页面，如下图：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300729625.webp" alt="2010-07-27_173712" loading="lazy" decoding="async"&gt;
&lt;/p&gt;</description></item><item><title>Net4.0—对HTML净化的处理</title><link>https://fwhyy.com/2010/07/net-4-purification-processing-of-html/</link><pubDate>Wed, 28 Jul 2010 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2010/07/net-4-purification-processing-of-html/</guid><description>&lt;p&gt;在使用Asp.Net进行Web开发时我一直都很注重最终生成的HTML是否干净，所以我会使用Repeater取代GridView等控件，可控性好而且生成的HTML代码也非常干净。干净的HTML有很多好处，如代码相应较少加载速度快，便于控制页面元素等。在AspNet4中对HTML的净化做了很大的改进，下面的文字中会做一个简单的介绍。&lt;/p&gt;
&lt;h2 id="设置controlrenderingcompatibilityversion"&gt;设置controlRenderingCompatibilityVersion&lt;/h2&gt;
&lt;p&gt;controlRenderingCompatibilityVersion需要在Webconfig文件中设置，配置在Pages节点中，可以设置使用3.5还是4.0的引擎来渲染HTML，默认是使用4.0。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300730129.webp" alt="2010-07-28_143021" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;在VS2010中创建一个AspNet项目，在项目中的site.master中会有一个Menu控件来显示导航，代码如下：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;asp:Menu ID=&amp;#34;NavigationMenu&amp;#34; runat=&amp;#34;server&amp;#34; CssClass=&amp;#34;menu&amp;#34;
EnableViewState=&amp;#34;false&amp;#34; IncludeStyleBlock=&amp;#34;false&amp;#34; Orientation=&amp;#34;Horizontal&amp;#34;&amp;gt;
 &amp;lt;Items&amp;gt;
 &amp;lt;asp:MenuItem NavigateUrl=&amp;#34;~/Default.aspx&amp;#34; Text=&amp;#34;Home&amp;#34;/&amp;gt;
 &amp;lt;asp:MenuItem NavigateUrl=&amp;#34;~/About.aspx&amp;#34; Text=&amp;#34;About&amp;#34;/&amp;gt;
 &amp;lt;/Items&amp;gt;
&amp;lt;/asp:Menu&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;分别设置 controlRenderingCompatibilityVersion属性值为3.5和4.0，运行项目，看到页面源码的区别如下：&lt;/p&gt;
&lt;p&gt;4.0&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2010/2010-07-28_150119.webp" alt="2010-07-28_150119" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;3.5&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300730347.webp" alt="2010-07-28_150528" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;可以看出使用4.0的引擎是将Menu控件生成的Ul 标签，而3.5中是生成的table，代码的复杂度明显大了很多。当然并不只是对Menu控件进行了优化，还有其他一些方面如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一些控件的内置样式被去掉，而是在页面中生成样式代码；&lt;/li&gt;
&lt;li&gt;模板控件中移除了外表表格渲染；&lt;/li&gt;
&lt;li&gt;向导类控件使用站位符控制层。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="使用clientidmode"&gt;使用ClientIDMode&lt;/h2&gt;
&lt;p&gt;在继承了masterpage页的页面中添加其他的服务器控件，最终呈现的HTML的的ID都会改变，如下：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300731072.webp" alt="2010-07-28_152923" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;AspNet4中可以使用ClientIDMode来改变这一局面，ClientIDMode在页面的Page指令中设置，如下：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;%@ Page Title=&amp;#34;&amp;#34; Language=&amp;#34;C#&amp;#34; MasterPageFile=&amp;#34;~/Site.Master&amp;#34; AutoEventWireup=&amp;#34;true&amp;#34;
CodeBehind=&amp;#34;test.aspx.cs&amp;#34; Inherits=&amp;#34;UrlRewriterDemo.test&amp;#34; ClientIDMode=&amp;#34;Static&amp;#34; %&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;将ClientIDMode设置为Static后，刷新页面查看源代码，控件的ID变成本来面目了，如下：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300731621.webp" alt="2010-07-28_154000" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;ClientIDMode有四个属性值：AutoID、Inherit、Predictable和Static，下面以上面的按钮为例，列出分别在这四种属性值下呈现的ID值：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AutoID：ctl00_MainContent_btnTest&lt;/li&gt;
&lt;li&gt;Inherit：MainContent_btnTest&lt;/li&gt;
&lt;li&gt;Predictable：MainContent_btnTest&lt;/li&gt;
&lt;li&gt;Static：btnTest&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="对viewstate更细致化的管理"&gt;对ViewState更细致化的管理&lt;/h2&gt;
&lt;p&gt;ViewState是让人又爱又恨的东西，控制不好会使页面变得非常庞大，在AspNet4中可以使用ViewStateMode对ViewState进行更细致化的管理。ViewStateMode可以在页面级设置也可以在控件级设置，有三个属性值：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Inherit：从父控件中继承；&lt;/li&gt;
&lt;li&gt;Enabled：当父控件的ViewState处于Disabled状态时可以设置当前控件ViewState可用；&lt;/li&gt;
&lt;li&gt;Disabled：当父控件的ViewState处于Enalbed状态时可以设置当前控件ViewState禁用。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在以前的AspNet版本中有个EnableViewState属性可以来设置ViewState，不过ViewStateMode和EnableViewState还是有很大区别的：&lt;/p&gt;
&lt;h3 id="enableviewstate"&gt;EnableViewState&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;其值为布尔类型，决定其控件或是子控件是否开启ViewState；&lt;/li&gt;
&lt;li&gt;优先级别大于ViewStateMode，只要 EnableViewState设置为false，就算设置了ViewStateMode为Enabled，控件的ViewState还是关闭的；&lt;/li&gt;
&lt;li&gt;当设置父控件的EnableViewState为false后，其子控件的ViewState就都关闭了，不能在子控件中单独开启ViewState。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="viewstatemode"&gt;ViewStateMode&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;在父控件以及本身的EnableViewState设置为true时，才会起作用；&lt;/li&gt;
&lt;li&gt;子控件不受父控件ViewStateMode的影响；&lt;/li&gt;
&lt;li&gt;在父控件中设置ViewStateMode为Disabled后，可以在子控件中设置ViewStateMode为Enabled来开启子控件的ViewState。&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Net4.0—AspNet中URL重写的改进</title><link>https://fwhyy.com/2010/07/net-4-aspnet-url-rewriting-in-the-improvement/</link><pubDate>Tue, 27 Jul 2010 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2010/07/net-4-aspnet-url-rewriting-in-the-improvement/</guid><description>&lt;p&gt;URL重写有很多的好处，如有利于SEO、便于记忆、隐藏真实路径使安全性提高、便于更新等等。在AspNet4.0之前的版本中要实现URL重写比较复杂，有时还会借助第三方类库，而在AspNet4.0中可以很方面实现，下面就一步一步来讲解怎样在AspNet4.0中实现URL重写。&lt;/p&gt;
&lt;p&gt;1 打开VS2010，创建一个AspNet项目命名为UrlRewriterDemo。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300727900.webp" alt="2010-07-27_100812" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;可以看到AspNet4中的项目结构有点类似AspNet MVC ，加了很多现成的东西，只需稍加修改就可以变成一个简单的个人站点。&lt;/p&gt;
&lt;p&gt;2 打开Global.asax文件，引用命名空间System.Web.Routing，System.Web.Routing命名空间在Net3.5中就已经存在，不过功能没有4.0中的强大。在该文件中添加如下方法:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;void RegisterRoutes(RouteCollection routes)
{
 routes.MapPageRoute(&amp;#34;productdetail&amp;#34;,
 &amp;#34;products/{category}/{name}&amp;#34;,
 &amp;#34;~/test.aspx&amp;#34;, false,
 new RouteValueDictionary { { &amp;#34;category&amp;#34;, &amp;#34;book&amp;#34; }, { &amp;#34;name&amp;#34;, &amp;#34;aspnet&amp;#34; } });
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;MapPageRoute方法的参数解释：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“productdetail”：路由名称，取一个和当前路由设置相匹配的名称即可。&lt;/li&gt;
&lt;li&gt;“products/{category}/{name}”：URL的重写规则。&lt;/li&gt;
&lt;li&gt;“~/test.aspx”：配置对应的物理文件。&lt;/li&gt;
&lt;li&gt;new RouteValueDictionary { { “category”, “book” }, { “name”, “aspnet” } }：配置默认值。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;3 在Global.asax中的方法Application_Start中添加如下代码：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;void Application_Start(object sender, EventArgs e)
{
 RegisterRoutes(RouteTable.Routes);
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;4 在项目中添加一个页面命名为test.aspx，如果命名为别的名称，在上面的MapPageRoute方法的配置物理文件的参数就应该设置为相应的名称。在test.aspx页面中添加如下内容：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;asp:Content ID=&amp;#34;Content2&amp;#34; ContentPlaceHolderID=&amp;#34;MainContent&amp;#34; runat=&amp;#34;server&amp;#34;&amp;gt;
 &amp;lt;h1&amp;gt;Url Rewriter Test Page!&amp;lt;/h1&amp;gt;
&amp;lt;/asp:Content&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;5 将该项目设置为固定端口，比如10000，按F5运行项目，将URL地址修改为http://localhost:10000/products，此处的products为URL重写规则中配置的名称。运行结果如下：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300727307.webp" alt="2010-07-27_104717_thumb" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;6 我们在RegisterRoutes中配置了默认参数值category和name，如需要在页面中获取参数值，可以使用RouteData.Values，将test.aspx页面代码修改如下：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;asp:Content ID=&amp;#34;Content2&amp;#34; ContentPlaceHolderID=&amp;#34;MainContent&amp;#34; runat=&amp;#34;server&amp;#34;&amp;gt;
 &amp;lt;h1&amp;gt;Url Rewriter Test Page!&amp;lt;/h1&amp;gt;&amp;lt;br /&amp;gt;

 分类名为：&amp;lt;%= RouteData.Values[&amp;#34;category&amp;#34;] %&amp;gt;&amp;lt;br /&amp;gt;
 产品名为：&amp;lt;%= RouteData.Values[&amp;#34;name&amp;#34;] %&amp;gt;
&amp;lt;/asp:Content&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;7 刷新页面可以看到在RegisterRoutes中配置的默认值会呈现在页面上：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300728509.webp" alt="2010-07-27_111408" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;8 将URL修改为http://localhost:10000/products/computer/thinkpad，再刷新页面可以看到页面中呈现的是URL中设置的分类名和产品名:&lt;/p&gt;</description></item><item><title>Net4.0—Web部署工具</title><link>https://fwhyy.com/2010/06/net-4-the-web-deployment-tool/</link><pubDate>Thu, 03 Jun 2010 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2010/06/net-4-the-web-deployment-tool/</guid><description>&lt;h2 id="vs2008的web部署和vs2010的web部署"&gt;VS2008的Web部署和VS2010的Web部署&lt;/h2&gt;
&lt;p&gt;VS2010的Web部署工具相较于以前的版本做了很大的改进，下面先来看看VS2010和VS2008的Web部署工具的图片：&lt;/p&gt;
&lt;h3 id="vs2008"&gt;VS2008&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300732166.webp" alt="2010-05-27_143737" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;在VS2008种首先是弹出Publish Web对话框，点击选择路径按钮后弹出下图的对话框&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300732168.webp" alt="2010-05-27_143831" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;在这个对话框中可以选择任意一种的发布方式。&lt;/p&gt;
&lt;p&gt;在VS2010中做了改进，将多个步骤封装在了一起，也称之为“一键部署”，让部署变得更加容易。如下图：&lt;/p&gt;
&lt;h3 id="vs2010"&gt;VS2010&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300732962.webp" alt="2010-05-27_155506" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;在VS2010的Web项目上点击右键选择Publish或是点击VS的工具条中的Publish（如下图）都可以弹出一键部署的对话框&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300732949.webp" alt="2010-06-03_141655" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;在Publish Web对话框中，通常我们需要填写下面几项内容&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Publish profile:这个是发布的名称&lt;/li&gt;
&lt;li&gt;Publish method：选择发布方式，有四种（Web Deploy、FTP、File System、FPSE）&lt;/li&gt;
&lt;li&gt;Server Url：如果在本地可以直接填写localhost&lt;/li&gt;
&lt;li&gt;Site/application：发布的站点的名称，在这里我们选择发布到本机的默认站点（Default Web Site）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;输入完成的对话框如下图：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300732196.webp" alt="2010-06-03_143525" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;点击右上角的Save按钮可以将当前设置保存以便以后使用，这些配置的信息存放在项目的根目录下的一个后缀为.Publish.xml的文件中，该文件的内容如下图：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300732680.webp" alt="2010-06-03_150947" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;点击Publish按钮后会出现错误，原因是应用程序池的运行时版本不是4.0，如下图：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300733208.webp" alt="2010-05-27_142656" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;打开IIS7，修改默认站点的应用程序池的版本为4.0即可，如下图：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300733423.webp" alt="2010-05-27_143028" loading="lazy" decoding="async"&gt;

&lt;img src="https://img.fwhyy.com/2022/202201300733426.webp" alt="2010-05-27_143107" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;修改完成后，重新发布就可以看到发布成功的提示。&lt;/p&gt;
&lt;h2 id="vs2010web项目中的webconfig文件"&gt;VS2010Web项目中的WebConfig文件&lt;/h2&gt;
&lt;p&gt;在VS2010中的Web项目的webconfig文件和以前版本不同，会多出来debug和release两个文件，如下图：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300733922.webp" alt="2010-06-03_151753" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;这两个文件时对应我们在编译项目时是选择的Debug还是Release，可以适应Debug和Release两种模式不同的需求。并且我们还可以自己添加新的配置文件来适应不同的需求，比如说现在需要一个测试环境下的配置文件，可以按下面步骤做：&lt;/p&gt;
&lt;p&gt;1 打开Build-Configuration Manager对话框，如下图：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300733480.webp" alt="2010-06-03_152700" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;2 点击New在弹出的对话框中输入文件名称Testing&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300733835.webp" alt="2010-06-03_153418" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;3 点击OK按钮Testing就会出现在下拉框中，这时再看项目中的webconfig文件下仍然只有Debug和Release两个文件，新加的Testing没有出现。在webconfig文件上点击右键，选择Add Config Transforms，Testing配置文件就会出现了，如下图：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300734304.webp" alt="2010-06-03_153720" loading="lazy" decoding="async"&gt;

&lt;img src="https://img.fwhyy.com/2022/202201300734204.webp" alt="2010-06-03_153834" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;4 我们可以通过修改不同的配置文件来达到在不同环境下的需求&lt;/p&gt;
&lt;h2 id="构建部署包"&gt;构建部署包&lt;/h2&gt;
&lt;p&gt;除了通过上面介绍的传统的方式发布Web程序外，还可以通过构建部署包的形式，在Web项目右击，会发现菜单中比以前版本多出来两项：&lt;/p&gt;
&lt;p&gt;1 Build Deployment Package：创建部署包&lt;/p&gt;
&lt;p&gt;2 Package/Publish Settings：创建部署包的设置&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300734292.webp" alt="2010-06-03_155336_thumb" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;点击Package/Publish Settings 和打开项目的属性然后选择Package/Publish Web的效果是一样的，如下图：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300734551.webp" alt="2010-06-03_155724" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;关于该界面中的各种配置选项，自行实验一下就都清楚了。配置好这些后，点击Build Deployment Package，就可以生成部署包了，部署包最终生成为一个zip文件，名称为项目名称。文件存放在项目下的obj\Testing\Package、obj\Debug\Package或obj\Release\Package下，这个要看是用那种模式进行发布的。&lt;/p&gt;
&lt;p&gt;构建了部署包之后只需要生成的zip文件就可以进行部署了，有两种方式可以部署：&lt;/p&gt;
&lt;p&gt;1 在zip文件的同目录下有个和项目同名，后缀为.deploy.cmd的文件，这是一个命令行的文件，执行文件中的一些脚本命令来进行部署，关于这种方式的部署设置在同目录下的ReadMe文件里有详细说明。这种方式的难度较大。&lt;/p&gt;
&lt;p&gt;2 第二种方式需要借助一个名为Web Deploy的第三方软件，可以点击此处&lt;a href="http://www.iis.net/download/webdeploy"&gt;下载&lt;/a&gt;，下载安装后，在IIS7的的站点上右击会多出“部署…”选项，如下图：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300734839.webp" alt="2010-06-03_164834" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;我们选择导入应用程序，弹出对话框中选择之前生成的zip文件，然后顺着下一步就行了，如下图：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300734339.webp" alt="2010-06-03_165355" loading="lazy" decoding="async"&gt;

&lt;img src="https://img.fwhyy.com/2022/202201300735229.webp" alt="2010-06-03_165830_thumb" loading="lazy" decoding="async"&gt;

&lt;img src="https://img.fwhyy.com/2022/202201300735872.webp" alt="2010-06-03_170326" loading="lazy" decoding="async"&gt;

&lt;img src="https://img.fwhyy.com/2022/202201300735255.webp" alt="2010-06-03_170442_thumb" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;完成后Web程序就会部署在IIS7中了。&lt;/p&gt;</description></item><item><title>Asp.Net控件开发(1)—入门介绍</title><link>https://fwhyy.com/2010/02/aspnet-controls-development-1-the-introduction/</link><pubDate>Tue, 09 Feb 2010 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2010/02/aspnet-controls-development-1-the-introduction/</guid><description>&lt;p&gt;AspNet为我们提供了很多的控件，尽管如此，很多时候我们还是会感觉这些控件不够用，想根据自己的需求去定制一些控件，比如想在DropDownList控件中实现可以输入，AspNet并没有为我们提供这样的控件，这时就需要我们去编写自定义控件来满足需要。 本系列文章打算对AspNet控件开发做个入门级介绍，如果想了解更详细和深入可以参考&lt;a href="http://www.douban.com/subject/2268475/"&gt;《深入解析ASP.NET 2.0控件开发》&lt;/a&gt;和&lt;a href="http://www.douban.com/subject/3626223/"&gt;《纵向切入ASP.NET 3.5控件和组件开发技术》&lt;/a&gt;这两本书。&lt;/p&gt;
&lt;p&gt;言归正传，通常我们开发自定义控件会创建一个类库项目，编写完代码后编译会生成一个dll文件，这个dll文件就是我们自己开发的控件了。假设现在已经有一个名为HelloWorld.dll的控件，按照下面方法可以将该控件用在我们的项目中。&lt;/p&gt;
&lt;p&gt;1 在工具箱中点击右键-&amp;gt;添加选项卡。选项卡可以任意命名，比如：MyControls&lt;/p&gt;
&lt;p&gt;2 在新添加的选项卡区域中右键-&amp;gt;选择项。选择HelloWorld.dll文件后确定，会看到控件已经添加到工具箱中，如下图：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201290824855.webp" alt="2010-12-28_235751" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;3 使用自定义控件和使用普通的AspNet控件一样，直接拖到页面中即可。将该控件拖入到页面中后，源视图中会添加如下代码：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;%@ Register Assembly=&amp;#34;ControlsDemo1&amp;#34; Namespace=&amp;#34;ControlsDemo1&amp;#34; TagPrefix=&amp;#34;cc1&amp;#34; %&amp;gt;

 &amp;lt;cc1:HelloWorld ID=&amp;#34;HelloWorld2&amp;#34; runat=&amp;#34;server&amp;#34;&amp;gt;
 &amp;lt;/cc1:HelloWorld&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;上面代码的第一行是注册该控件，TagPrefix属性指定控件的前缀，cc1是系统默认的前缀，我们也可以根据自己的喜好来自定义前缀，如下：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;%@ Register Assembly=&amp;#34;ControlsDemo1&amp;#34; Namespace=&amp;#34;ControlsDemo1&amp;#34; TagPrefix=&amp;#34;oec2003&amp;#34; %&amp;gt;
 &amp;lt;oec2003:HelloWorld ID=&amp;#34;HelloWorld1&amp;#34; runat=&amp;#34;server&amp;#34;&amp;gt;
 &amp;lt;/oec2003:HelloWorld&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;&amp;lt;%@ Resgiter /&amp;gt;&lt;/code&gt;指令只是在单个页面中使用，我们还可以通过在web.config中配置来使全局都能够使用。web.config配置如下：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;system.web&amp;gt;
 &amp;lt;pages&amp;gt;
 &amp;lt;controls&amp;gt;
 &amp;lt;add assembly=&amp;#34;ControlsDemo1&amp;#34; namespace=&amp;#34;ControlsDemo1&amp;#34; tagPrefix=&amp;#34;oec2003&amp;#34;/&amp;gt;
 &amp;lt;/controls&amp;gt;
 &amp;lt;/pages&amp;gt;
&amp;lt;/system.web&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;上面简单介绍了怎样使用一个已经编写好的自定义控件，并且知道编写一个自定义控件通常是创建一个类库项目。现在就来看看一个自定义控件的具体实现方法。&lt;/p&gt;
&lt;p&gt;实现一个自定义控件，我们需要选择一个基类，这些基类有控件需要的最基本的功能，下面的三个类就是开发控件常用的基类。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;System.Web.UI.Control
System.Web.UI.WebControls.WebControl
System.Web.UI.WebControls.CompositeControl
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;Control：控件开发的基类，所有控件都直接或间接继承该类。该类的扩展性和灵活性最强。&lt;/li&gt;
&lt;li&gt;WebControl：该类继承自Control类，除了有Control的所有属性外，还提供布局样式等特性。比较适合对布局和外观样式要求较高的控件。和Control相同的是都适用于开发单个控件。&lt;/li&gt;
&lt;li&gt;CompositeControl：该类为AspNet2.0提供的一个控件基类。如果想把现有控件组合起来创建一个组合控件时，可以继承此类，此类继承了WebControl并实现了INamingContainer接口。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果我们只是对某一个现有的AspNet控件进行简单的扩充，我们可以用现有的任一控件作为基类。&lt;/p&gt;
&lt;p&gt;Control类最基础灵活性最强，那么就先以Control类为基类实现一个简单的HelloWorld控件。在新建的项目中创建一个类HelloWorld，继承Control，并重写Render方法，代码如下：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;public class HelloWorld:Control
{
 protected override void Render(HtmlTextWriter writer)
 {
 writer.WriteLine(&amp;#34;hello world!&amp;#34;);
 }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;编译后按照上面介绍的方法添加到工具箱中，然后拖到页面，运行后会在页面上呈现Hello world文本。现在对上面的代码做点改动让hello world文本的显示区加上边框和背景色，代码如下：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;public class HelloWorld:Control
{
 protected override void Render(HtmlTextWriter writer)
 {
 writer.WriteLine(@&amp;#34;&amp;lt;div style=&amp;#34;&amp;#34;width:200px;height:100px;
 border:1px solid #4DA9C2;background-color:#C3D9FF&amp;#34;&amp;#34; &amp;gt;&amp;#34;);
 writer.WriteLine(&amp;#34;hello world!&amp;#34;);
 writer.WriteLine(@&amp;#34;&amp;lt;/div&amp;gt;&amp;#34;);
 }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;运行后的效果：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201290825971.webp" alt="2010-12-28_235833" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;效果虽然出来了，但是代码中是使用直接输出html代码和内嵌样式的方式，这样做当然是不好的，不是很好扑捉错误并且生成到客户端的html代码格式也不好。这个问题我们可以通过HtmlTextWriterAttribute、HtmlTextWriterTag、HtmlTextWriterStyle这三个枚举来解决。看下面代码：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;public class HelloWorld:Control
{
 protected override void Render(HtmlTextWriter writer)
 {
 writer.AddStyleAttribute(HtmlTextWriterStyle.BorderWidth, &amp;#34;1px&amp;#34;);
 writer.AddStyleAttribute(HtmlTextWriterStyle.BorderStyle, &amp;#34;solid&amp;#34;);
 writer.AddStyleAttribute(HtmlTextWriterStyle.BorderColor, &amp;#34;#4DA9C2&amp;#34;);
 writer.AddStyleAttribute(HtmlTextWriterStyle.BackgroundColor, &amp;#34;#C3D9FF&amp;#34;);
 writer.AddStyleAttribute(HtmlTextWriterStyle.Width, &amp;#34;200px&amp;#34;);
 writer.AddStyleAttribute(HtmlTextWriterStyle.Height, &amp;#34;100px&amp;#34;);
 writer.RenderBeginTag(HtmlTextWriterTag.Div);

 writer.WriteLine(&amp;#34;hello world!&amp;#34;);

 writer.RenderEndTag();
 }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;运行后效果和上面一样。并且查看页面的源代码可以看出用这种方式生成的html有规范的缩进，并且代码也是符合xhtml规范的，所以建议尽量使用这种方式而不是直接拼写html代码。&lt;/p&gt;</description></item><item><title>Asp.Net MVC 2 RC 2 发布</title><link>https://fwhyy.com/2010/02/aspnet-mvc-2-rc-2-release/</link><pubDate>Fri, 05 Feb 2010 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2010/02/aspnet-mvc-2-rc-2-release/</guid><description>&lt;p&gt;刚刚在&lt;a href="http://weblogs.asp.net/scottgu/default.aspx"&gt;ScottGu&lt;/a&gt;的blog上看到了ASP.NET MVC 2 RC 2发布的消息，该版本的IDE只支持VS2008.在该版本中修复了一些bug，并添加修改了一些API。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=7aba081a-19b9-44c4-a247-3882c8f749e3&amp;amp;displaylang=en"&gt;点击下载&lt;/a&gt;
有关此版本详细的介绍请看ScottGu的博文 。&lt;/p&gt;
&lt;p&gt;博客园的SZW对该文进行了翻译 ：&lt;a href="http://www.cnblogs.com/szw/archive/2010/02/05/1664704.html"&gt;http://www.cnblogs.com/szw/archive/2010/02/05/1664704.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;当然也可以稍后访问&lt;a href="http://blog.joycode.com/scottgu"&gt;ScottGu博客&lt;/a&gt;中文版进行了解&lt;/p&gt;</description></item><item><title>Lable和Literal控件的使用和区别</title><link>https://fwhyy.com/2010/01/the-use-of-the-lable-and-literal-controls-and-differences/</link><pubDate>Sat, 23 Jan 2010 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2010/01/the-use-of-the-lable-and-literal-controls-and-differences/</guid><description>&lt;p&gt;Lable和Literal这两个控件是我们非常熟悉的两个控件，都是用作内容呈现用的，但他们之间也有不同之处，分别应用于不同的地方。Lable控件会将内容呈现在html标签span中，即Lable控件的Text属性的值会包含在&lt;span&gt;标签中。而Literal控件生成的代码则比较干净，它的Text属性的值将直接显示在页面中，看下面两段代码：&lt;/p&gt;
&lt;p&gt;Lable：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;asp:Label ID=&amp;#34;lblUserName&amp;#34; runat=&amp;#34;server&amp;#34; Text=&amp;#34;用户名&amp;#34;&amp;gt;&amp;lt;/asp:Label&amp;gt;
&amp;lt;asp:TextBox ID=&amp;#34;txtUserName&amp;#34; runat=&amp;#34;server&amp;#34;&amp;gt;&amp;lt;/asp:TextBox&amp;gt;&amp;lt;br /&amp;gt;
&amp;lt;asp:Label ID=&amp;#34;lblPwd&amp;#34; runat=&amp;#34;server&amp;#34; Text=&amp;#34;密码&amp;#34;&amp;gt;&amp;lt;/asp:Label&amp;gt;
&amp;lt;asp:TextBox ID=&amp;#34;txtPwd&amp;#34; runat=&amp;#34;server&amp;#34;&amp;gt;&amp;lt;/asp:TextBox&amp;gt;&amp;lt;br /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Literal：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;asp:Literal runat=&amp;#34;server&amp;#34; ID=&amp;#34;litUserName&amp;#34; Text=&amp;#34;用户名&amp;#34;&amp;gt;&amp;lt;/asp:Literal&amp;gt;
&amp;lt;asp:TextBox ID=&amp;#34;txtUserName1&amp;#34; runat=&amp;#34;server&amp;#34;&amp;gt;&amp;lt;/asp:TextBox&amp;gt;&amp;lt;br /&amp;gt;
&amp;lt;asp:Literal runat=&amp;#34;server&amp;#34; ID=&amp;#34;litPwd&amp;#34; Text=&amp;#34;密码&amp;#34;&amp;gt;&amp;lt;/asp:Literal&amp;gt;
&amp;lt;asp:TextBox ID=&amp;#34;txtPwd1&amp;#34; runat=&amp;#34;server&amp;#34;&amp;gt;&amp;lt;/asp:TextBox&amp;gt;&amp;lt;br /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;上面两段程序运行的结果都如下图：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201302120262.webp" alt="2010-12-29_1138351" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;再来看看上面的代码生成的源码：&lt;/p&gt;
&lt;p&gt;Lable&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;span id=&amp;#34;lblUserName&amp;#34;&amp;gt;用户名&amp;lt;/span&amp;gt;
&amp;lt;input name=&amp;#34;txtUserName&amp;#34; type=&amp;#34;text&amp;#34; id=&amp;#34;txtUserName&amp;#34; /&amp;gt;&amp;lt;br /&amp;gt;
&amp;lt;span id=&amp;#34;lblPwd&amp;#34;&amp;gt;密码&amp;lt;/span&amp;gt;
&amp;lt;input name=&amp;#34;txtPwd&amp;#34; type=&amp;#34;text&amp;#34; id=&amp;#34;txtPwd&amp;#34; /&amp;gt;&amp;lt;br /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Literal&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;用户名
&amp;lt;input name=&amp;#34;txtUserName1&amp;#34; type=&amp;#34;text&amp;#34; id=&amp;#34;txtUserName1&amp;#34; /&amp;gt;&amp;lt;br /&amp;gt;
密码
&amp;lt;input name=&amp;#34;txtPwd1&amp;#34; type=&amp;#34;text&amp;#34; id=&amp;#34;txtPwd1&amp;#34; /&amp;gt;&amp;lt;br /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;从源码中可以很清楚看出Lable最终在客户端会生成Span标签，而Literal则直接显示文本，记得曾经维护过的一个自定义控件，在不同留言器中有样式问题，调试很久最终发现就是Lable生成的Span惹的祸，最终换成Literal得以解决，所以后来但凡要显示文本的地方我基本都是用Literal。不过Lable也不是一无是处，Lable控件有一个AssociatedControlID，可以将该属性指向一个表单控件的ID，通常为TextBox，看下面代码：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;asp:Label ID=&amp;#34;lblUserName&amp;#34; runat=&amp;#34;server&amp;#34; AssociatedControlID=&amp;#34;txtUserName&amp;#34; Text=&amp;#34;用户名&amp;#34;&amp;gt;&amp;lt;/asp:Label&amp;gt;
&amp;lt;asp:TextBox ID=&amp;#34;txtUserName&amp;#34; runat=&amp;#34;server&amp;#34;&amp;gt;&amp;lt;/asp:TextBox&amp;gt;&amp;lt;br /&amp;gt;
&amp;lt;asp:Label ID=&amp;#34;lblPwd&amp;#34; runat=&amp;#34;server&amp;#34; AssociatedControlID=&amp;#34;txtPwd&amp;#34; Text=&amp;#34;密码&amp;#34;&amp;gt;&amp;lt;/asp:Label&amp;gt;
&amp;lt;asp:TextBox ID=&amp;#34;txtPwd&amp;#34; runat=&amp;#34;server&amp;#34;&amp;gt;&amp;lt;/asp:TextBox&amp;gt;&amp;lt;br /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;和上面的代码基本一样只是添加了AssociatedControlID属性，分别指向了两个TextBox控件的ID，添加了这个属性后生成的源码就变了，如下：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;label for=&amp;#34;txtUserName&amp;#34; id=&amp;#34;lblUserName&amp;#34;&amp;gt;用户名&amp;lt;/label&amp;gt;
&amp;lt;input name=&amp;#34;txtUserName&amp;#34; type=&amp;#34;text&amp;#34; id=&amp;#34;txtUserName&amp;#34; /&amp;gt;&amp;lt;br /&amp;gt;
&amp;lt;label for=&amp;#34;txtPwd&amp;#34; id=&amp;#34;lblPwd&amp;#34;&amp;gt;密码&amp;lt;/label&amp;gt;
&amp;lt;input name=&amp;#34;txtPwd&amp;#34; type=&amp;#34;text&amp;#34; id=&amp;#34;txtPwd&amp;#34; /&amp;gt;&amp;lt;br /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;可以看出有Span标签变成了lable标签 for属性指向了TextBox的id。AssociatedControlID属性的使用能够给残障人士带来方便，如果使用读屏器之类的辅助设备来和网站进行交互，AssociatedControlID属性能帮助辅助设备将标签和字段关联起来。除此之外还有一个好处就是当点击标签时，所关联的TextBox就会获得焦点。&lt;/p&gt;
&lt;p&gt;由于Lable控件的内容最终呈现在Span标签中，所以Lable控件也支持Span标签的一些属性，如BackColor，CssClass等。Literal控件不生成Span标签，当然也不支持那些属性，不过Literal控件有个Mode属性，该属性有三个值&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Encode ：在编码Html内容后再显示控件的内容&lt;/li&gt;
&lt;li&gt;PassThrough ：显示控件的内容不进行编码&lt;/li&gt;
&lt;li&gt;Transform ：清除一些不支持的标记后在呈现内容&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;看下面的代码：&lt;/p&gt;</description></item><item><title>Asp.net MVC V2 Preview 1 初探</title><link>https://fwhyy.com/2009/08/aspnet-mvc-v2-preview-1/</link><pubDate>Thu, 06 Aug 2009 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2009/08/aspnet-mvc-v2-preview-1/</guid><description>&lt;p&gt;Asp.net MVC1.0正式版刚刚出来才几个月，ASP.NET MVC ASP.NET MVC2 Preview 1 Released 就跟我们见面了 ，您可以点击&lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=d34f9eaa-fcbe-4e20-b2fd-a9a03de7d6dd#tm"&gt;这儿&lt;/a&gt;下载。该版本可以和以前的Asp.net MVC1.0 兼容，安装了ASP.NET MVC2后，打开vs2008 ，新建项目，可以看到同时存在1.0和2的模板，如下图：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201290821727.webp" alt="2010-12-29_161754" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;在ASP.NET MVC2版中，包含了区域（Area）、数据标记验证（Data Annotation Validation）、强类型UI辅助方法和模板化辅助方法（TemplatedHelper）四个特性，下面就分别来看下这个四个特性。&lt;/p&gt;
&lt;h2 id="区域areas"&gt;区域（Areas）&lt;/h2&gt;
&lt;p&gt;区域（Areas）可以将Asp.net MVC应用的功能进行分割和组合，它可以将Controller和View进行分组管理。如下图中就是将博客（blogs）和相册（Albums）的部分通过Areas提出来单独管理。遗憾的是在预览版1中还没有任何工具的支持，所以Areas项目必须通过手动添加和配置。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201290821872.webp" alt="2010-12-29_161937" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h2 id="数据标记验证data-annotation-validation"&gt;数据标记验证（Data Annotation Validation）&lt;/h2&gt;
&lt;p&gt;DataAnnotation提供了一个简单的方式，在应用中的Model（模型）和ViewModel（视图模型）类中添加验证规则，在ASP.NET MVC中有自动的绑定和UI辅助方法验证支持。首先创建一个实体类Users，代码如下:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;namespace Mvc2Demo.Models
{
 public class Users
 {
 [Required(ErrorMessage = &amp;#34;用户名不能为空！&amp;#34;)]
 public String UserName { get; set; }

 [Range(0, 150, ErrorMessage = &amp;#34;年龄必须在0-150之间！&amp;#34;)]
 [Required(ErrorMessage = &amp;#34;年龄不能为空！&amp;#34;)]
 public Int32 Age { get; set; }

 [Required(ErrorMessage = &amp;#34;邮箱地址不能为空！&amp;#34;)]
 [RegularExpression(&amp;#34;\\w+([-+.&amp;#39;]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*&amp;#34;,
 ErrorMessage = &amp;#34;邮箱格式不正确，请重新填写！&amp;#34;)]
 public String Email { get; set; }
 }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;使用Required 、RegularExpression 等属性需要引用命名空间&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;using System.ComponentModel.DataAnnotations;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;在Controllers目录下创建UserController.cs，代码如下：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;namespace Mvc2Demo.Controllers
{
 public class UserController : Controller
 {
 public ActionResult Index()
 {
 return View();
 }
 public ActionResult Create()
 {
 Users user = new Users();
 return View(user);
 }
 //在ASP.NET MVC2预览一版中使用[HttpPost]
 //1.0版中使用[AcceptVerbs(HttpVerbs.Post)]
 [HttpPost]
 public ActionResult Create(Users user)
 {
 if (!ModelState.IsValid)
 {
 return View(user);
 }
 return View(&amp;#34;Success&amp;#34;);
 }
 }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;在上面的任意一个Create方法上右击，选择Add View … ，在弹出的对话框中做相应的设置，然后点击Add，就会在View下添加相应的目录和页面文件，如下图：&lt;/p&gt;</description></item><item><title>AjaxPro版自动完成（Autocomplete）功能实现</title><link>https://fwhyy.com/2009/07/ajaxpro-autocomplete-function-implementation/</link><pubDate>Mon, 13 Jul 2009 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2009/07/ajaxpro-autocomplete-function-implementation/</guid><description>&lt;p&gt;07年的时候写过一篇有关自动完成(Atuocomplete)的文章 &lt;a href="http://www.cnblogs.com/oec2003/archive/2007/08/18/860870.html"&gt;asp.net Ajax —AutoComplete控件使用&lt;/a&gt; ，那篇文章中使用的是Asp.net Ajax ControlTollKit中的一个控件，虽然那时对里面几十个控件都研究过，不过遗憾的是在实际开发中确从未用到过，鉴于现在Ajaxpro的易用性和普遍性，本文将使用ajaxpro来实现自动完成的功能。&lt;/p&gt;</description></item><item><title>CLR Via C# 学习笔记（5） 静态构造函数的性能</title><link>https://fwhyy.com/2009/07/clr-via-csharp-learning-notes-5-the-performance-of-the-static-constructor/</link><pubDate>Wed, 08 Jul 2009 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2009/07/clr-via-csharp-learning-notes-5-the-performance-of-the-static-constructor/</guid><description>&lt;blockquote&gt;
&lt;p&gt;CLR Via C#》这本书以前就粗略看过两遍，但一直都没能深入理解，而且很多内容也忘记了，现在准备重新看一遍，并将看过的部分写出来，因为写的过程也是一个加深理解的过程。本系列算是学习的一个记录吧，也可以方便以后自己查阅，如果对大家还有些帮助的话，我就很高兴了。书我是选择性的看的，所以顺序和书中的顺序可能不一样。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在上一篇《CLR Via C# 学习笔记（4） 方法 构造函数 》中讲到了一些静态构造函数方面的知识，现在也回顾一下，大概总结如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;静态构造函数是私有的（private） ，而且不能人为去修改访问修饰符。&lt;/li&gt;
&lt;li&gt;静态构造函数不应该去调用基类的静态构造函数，因为静态字段不会被继承到子类。&lt;/li&gt;
&lt;li&gt;静态构造函数在一个类型中有且仅有一个，并且是无参的。&lt;/li&gt;
&lt;li&gt;静态构造函数中只能初始化静态字段。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;从上面的第一点可以知道静态构造函数都是private的，所以不能显示区进行调用，关于JIT何时会去生成调用静态构造函数的代码。存在着两种说法。通常被称为Precise和BeforeFieldInit。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Precise方式JIT编译器生成调用的时机：首次创建类型的代码之前；访问类的非继承字段或成员代码之前。&lt;/li&gt;
&lt;li&gt;BeforeFieldInit方式JIT编译器生成调用的时机：在访问费继承静态字段代码之前。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这两种方式的主要区别就是选择调用静态构造函数的时机是否是确定的，Precise方式CLR会在确定的时刻调用静态构造函数，而BeforeFieldInit方式CLR可以自由选择调用静态构造函数的时机，利用这一点，CLR可以根据类型是否在程序域中加载来选择静态构造函数的调用次数，以便能生成执行更快的代码。&lt;/p&gt;
&lt;p&gt;下面来看来个类分别展现了这两种方式&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;public classUserPrecise
{
 public static string_name = &amp;#34;内联赋值：oec2003&amp;#34;;
 staticUserPrecise()
 {
 _name = &amp;#34;构造函数赋值：oec2003&amp;#34;;
 }
}
public classUserBeforeFieldInit
{
 public static string_name = &amp;#34;内联赋值：oec2003&amp;#34;;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;通过IL代码可以看出在UserBeforeFieldInit 的元数据上有BeforeFieldInit的标记，如下图：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201290802573.webp" alt="2010-12-29_173428" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;既然上面提到BeforeFieldInit方式CLR可以选择调用构造函数的次数从而来生成执行更快的代码，下面就写一段测试代码来看看究竟怎样。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;span class="lnt"&gt;56
&lt;/span&gt;&lt;span class="lnt"&gt;57
&lt;/span&gt;&lt;span class="lnt"&gt;58
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c#" data-lang="c#"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;sealed&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Program&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="n"&gt;Main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Int32&lt;/span&gt; &lt;span class="n"&gt;iterations&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1000&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="m"&gt;1000&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="m"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Test1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;iterations&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Test2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;iterations&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="n"&gt;Test1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Int32&lt;/span&gt; &lt;span class="n"&gt;iterations&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Stopwatch&lt;/span&gt; &lt;span class="n"&gt;sw&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Stopwatch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StartNew&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Int32&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;iterations&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;++)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;UserBeforeFieldInit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;oec2003&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Test1-UserBeforeFieldInit 用时：&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;sw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Elapsed&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sw&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Stopwatch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StartNew&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Int32&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;iterations&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;++)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;UserPrecise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;oec2003&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Test1-UserPrecise 用时：&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;sw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Elapsed&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="n"&gt;Test2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Int32&lt;/span&gt; &lt;span class="n"&gt;iterations&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Stopwatch&lt;/span&gt; &lt;span class="n"&gt;sw&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Stopwatch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StartNew&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Int32&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;iterations&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;++)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;UserBeforeFieldInit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;oec2003&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Test2-UserBeforeFieldInit 用时：&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;sw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Elapsed&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sw&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Stopwatch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StartNew&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Int32&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;iterations&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;++)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;UserPrecise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;oec2003&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Test2-UserPrecise 用时：&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;sw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Elapsed&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserBeforeFieldInit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;_name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserPrecise&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;_name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="n"&gt;UserPrecise&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;_name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;oec2003&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;测试结果如下：&lt;/p&gt;</description></item><item><title>CLR Via C# 学习笔记（4） 方法 构造函数</title><link>https://fwhyy.com/2009/07/clr-via-csharp-learning-notes-5-methods-the-constructor/</link><pubDate>Fri, 03 Jul 2009 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2009/07/clr-via-csharp-learning-notes-5-methods-the-constructor/</guid><description>&lt;blockquote&gt;
&lt;p&gt;《CLR Via C#》这本书以前就粗略看过两遍，但一直都没能深入理解，而且很多内容也忘记了，现在准备重新看一遍，并将看过的部分写出来，因为写的过程也是一个加深理解的过程。本系列算是学习的一个记录吧，也可以方便以后自己查阅，如果对大家还有些帮助的话，我就很高兴了。书我是选择性的看的，所以顺序和书中的顺序可能不一样。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;构造函数是可以将类型实例初始化为有效状态的特殊方法。构造函数在元数据中通常用.ctor来表示，通过IL代码可以看到。在创建一个类型的实例时，通常分为三步：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;为实例的数据字段分配内存。&lt;/li&gt;
&lt;li&gt;创建对象指针和同步索引块。&lt;/li&gt;
&lt;li&gt;调用类型的实例构造器来设置对象的初始状态。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="引用类型的实例构造器"&gt;引用类型的实例构造器&lt;/h2&gt;
&lt;p&gt;在创建一个引用类型的对象是，调用类型的实例构造函数之前，会将对象分配的内存做清零处理，就是说在构造函数中没有显示赋值的所有字段都将设置为0或null。&lt;/p&gt;
&lt;p&gt;实例构造函数和一般方法不同，他永远都不能被继承，所有以下的关键字也不能用于实例构造函数（virtual new override sealed abstract）。&lt;/p&gt;
&lt;p&gt;一个类中如果没有显示定义任何构造函数，C#编译器将定义一个默认的无参构造函数。&lt;/p&gt;
&lt;p&gt;抽象（abstract）类的默认构造函数的访问修饰符为protected。&lt;/p&gt;
&lt;p&gt;构造函数可以初始化字段，不过在c#语言中提供了一种简单的方法，在定义字段的时候直接赋值以初始化。如下：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;public class User
{
 private int _age = 25;
 private string _name = &amp;#34;oec2003&amp;#34;;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;像上面那样的确很方便，但如果有好几个已经初始化的实例字段和多个重载的构造函数同时存在的情况下，就应该将实例字段的初始化放到一个公共的构造函数中，其他的构造函数通过this来显示调用该构造函数，这样可以减少代码生成的大小，看下面的例子。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;public abstract class User
{
 private int _age = 25;
 private string _name = &amp;#34;oec2003&amp;#34;;
 private string _email = &amp;#34;oec2003@gmail.com&amp;#34;;

 public User(Int32 age)
 {
 this._age = age;
 }

 public User(string name)
 {
 this._name = name;
 }

 public User(Int32 age, String name, String email)
 {
 this._age = age;
 this._name = name;
 this._email = email;
 }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;正确的写法应该像下面这样&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;public abstract class User
{
 private int _age;
 private string _name;
 private string _email;

 public User()
 {
 _age = 25;
 _name = &amp;#34;oec2003&amp;#34;;
 _email = &amp;#34;oec2003@gmail.com&amp;#34;;
 }

 public User(Int32 age)
 : this()
 {
 this._age = age;
 }

 public User(string name)
 : this()
 {
 this._name = name;
 }

 public User(Int32 age, String name, String email)
 : this()
 {
 this._age = age;
 this._name = name;
 this._email = email;
 }
}
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="值类型的实例构造函数"&gt;值类型的实例构造函数&lt;/h2&gt;
&lt;p&gt;值类型的实例构造函数和引用类型的有很大不同，在值类型中不能含有无参的构造函数，如果显式指定无参的构造函数将会出现编译错误。如下面代码会出现编译错误：&lt;/p&gt;</description></item><item><title>Asp.Net中替代Eval的两种方式</title><link>https://fwhyy.com/2009/06/aspnet-instead-of-eval-in-two-ways/</link><pubDate>Fri, 26 Jun 2009 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2009/06/aspnet-instead-of-eval-in-two-ways/</guid><description>&lt;p&gt;在asp.net中的数据绑定中，我们经常会用到Eval，不过大家都知道Eval绑定是通过反射来实现的， 而反射势必会对性能造成一定的影响。不过有两种替代的方式来实现绑定数据，对性能略有提高。&lt;/p&gt;
&lt;p&gt;1 当数据源为DataTable时，用下面的方式:&lt;/p&gt;
&lt;p&gt;后台代码&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;protected void Page_Load(object sender, EventArgs e)
{
 DataTable dt = new DataTable();
 dt.Columns.Add(&amp;#34;Name&amp;#34;, typeof(System.String));
 dt.Columns.Add(&amp;#34;Age&amp;#34;, typeof(System.Int32));
 for (int i = 0; i &amp;lt;= 20; i++)
 {
 DataRow dr = dt.NewRow();
 dr[0] = &amp;#34;oec2003_&amp;#34; + i.ToString();
 dr[1] = i + 20;
 dt.Rows.Add(dr);
 }

 rptUser.DataSource = dt;
 rptUser.DataBind();
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;前台代码&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;asp:Repeater ID=&amp;#34;rptUser&amp;#34; runat=&amp;#34;server&amp;#34;&amp;gt;
 &amp;lt;ItemTemplate&amp;gt;
 姓名：&amp;lt;%# ((DataRowView)(Container.DataItem))[&amp;#34;Name&amp;#34;] %&amp;gt;
 年龄：&amp;lt;%# ((DataRowView)(Container.DataItem))[&amp;#34;Age&amp;#34;]%&amp;gt;&amp;lt;br /&amp;gt;
 &amp;lt;/ItemTemplate&amp;gt;
&amp;lt;/asp:Repeater&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;2 当数据源为泛型类时，用下面的方式。&lt;/p&gt;
&lt;p&gt;后台代码&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;protected void Page_Load(object sender, EventArgs e)
{
 List&amp;lt;User&amp;gt; user = new List&amp;lt;User&amp;gt;();
 for (int i = 0; i &amp;lt; 10; i++)
 {
 user.Add(new User(i, &amp;#34;oec2003&amp;#34;));
 }
 rptUser.DataSource = user;
 rptUser.DataBind();
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;前台代码&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;asp:Repeater ID=&amp;#34;rptUser&amp;#34; runat=&amp;#34;server&amp;#34;&amp;gt;
 &amp;lt;ItemTemplate&amp;gt;
 姓名：&amp;lt;%# (Container.DataItem as User).Name %&amp;gt;
 年龄：&amp;lt;%# (Container.DataItem as User).Age%&amp;gt;&amp;lt;br /&amp;gt;
 &amp;lt;/ItemTemplate&amp;gt;
&amp;lt;/asp:Repeater&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;经过测试在10w以上数据量的时候性能差别才比较明显，而我们平时做数据绑定的时候通常都是用的分页存储过程或其他的分页方式，每页最多几十条数据，所以我认为Eval在性能上的损耗并不构成性能瓶颈。&lt;/p&gt;</description></item><item><title>ZedGraph在Web中的使用</title><link>https://fwhyy.com/2009/06/use-zedgraph-in-the-web/</link><pubDate>Sat, 06 Jun 2009 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2009/06/use-zedgraph-in-the-web/</guid><description>&lt;p&gt;上一篇&lt;a href="http://blog.fwhyy.com/2009/06/sql-implementation-group-statistical-query/"&gt;SQL实现分组统计查询（按月、小时分组）&lt;/a&gt; 中介绍了按月和小时为单位怎样实现分组查询，在本文中会实现将上文查询的结果以图表的形式显示在页面上。在页面上显示图标有很多种解决方案，office的owc组建、自己写代码、或者是第三方的控件。本文中将使用ZedGraph控件来实现。选择ZedGraph有两个原因：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;该控件是开源的，在必要的时候可以根据自己的需要来修改；&lt;/li&gt;
&lt;li&gt;该控件所显示的图片是绘出来的，而不是生成的图片。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;下载地址：&lt;a href="http://sourceforge.net/project/showfiles.php?group_id=114675"&gt;http://sourceforge.net/project/showfiles.php?group_id=114675&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;1 将控件引用到项目中，本示例使用的是5.1.5版。&lt;/p&gt;
&lt;p&gt;在工具栏下方的空白处点击右键—&amp;gt;添加选项卡,命名为ZedGraph&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201290709681.webp" alt="2010-12-30_101747" loading="lazy" decoding="async"&gt;

&lt;img src="https://img.fwhyy.com/2022/202201290709929.webp" alt="2010-12-30_101836" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;在ZedGraph选项卡点右键—&amp;gt;选择项…,在弹出窗口中选择下载下来的ZedGraph.Web.dll文件。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201290709682.webp" alt="https://img.fwhyy.com/14712687428710.webp" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;2 在项目中新建一aspx页面，命名为Year.aspx,将刚添加的ZedGraph控件拖到页面中，并在页面中添加一个文本框和一个按钮，文本框用来选择年份。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201290710090.webp" alt="2010-12-30_102641" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;3 切换到代码视图，添加如下代码：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;namespace ZedGraphDemo
{
 public partial class Year : System.Web.UI.Page
 {
 protected void Page_Load(object sender, EventArgs e)
 {
 this.ZgwYear.RenderGraph +=
 new ZedGraphWebControlEventHandler(ZgwYear_RenderGraph);
 }

 void ZgwYear_RenderGraph(ZedGraphWeb webObject,
 System.Drawing.Graphics g, MasterPane pane)
 {
 GraphPane myPane = pane[0];

 // 标题
 myPane.Title.Text = &amp;#34;每年分析（月为单位）&amp;#34;;
 myPane.XAxis.Title.Text = &amp;#34;时间&amp;#34;;
 myPane.YAxis.Title.Text = &amp;#34;访问量&amp;#34;;

 // 坐标对集
 PointPairList list = new PointPairList();
 //PointPairList list1 = new PointPairList();
 //PointPairList list2 = new PointPairList();

 //从数据库中获取数据集
 DataTable dtYear = GetData();
 if (dtYear == null)
 return;
 for (int i = 0; i &amp;lt; dtYear.Rows.Count; i++)
 {
 list.Add(Convert.ToDouble(i), Convert.ToDouble(dtYear.Rows[i][&amp;#34;Count&amp;#34;]));
 //如果有多种类型，可以添加多个
 //list1.Add(Convert.ToDouble(i), Convert.ToDouble(dtYear.Rows[i][&amp;#34;Count1&amp;#34;]));
 //list2.Add(Convert.ToDouble(i), Convert.ToDouble(dtYear.Rows[i][&amp;#34;Count2&amp;#34;]));
 }

 BarItem myBar = myPane.AddBar(&amp;#34;页面访问&amp;#34;, list, Color.Blue);
 //BarItem myBar1 = myPane.AddBar(&amp;#34;&amp;#34;, list1, Color.Red);
 //BarItem myBar2 = myPane.AddBar(&amp;#34;&amp;#34;, list2, Color.Yellow);

 myBar.Bar.Fill = new Fill(Color.Blue, Color.White, Color.Blue);
 //myBar1.Bar.Fill = new Fill(Color.Red, Color.White, Color.Red);
 //myBar2.Bar.Fill = new Fill(Color.Yellow, Color.White, Color.Yellow);

 myPane.XAxis.MajorTic.IsBetweenLabels = true;
 // X轴Label
 string[] labels = new string[] { &amp;#34;1月&amp;#34;, &amp;#34;2月&amp;#34;, &amp;#34;3月&amp;#34;, &amp;#34;4月&amp;#34;, &amp;#34;5月&amp;#34;, &amp;#34;6月&amp;#34;,
 &amp;#34;7月&amp;#34;, &amp;#34;8月&amp;#34;, &amp;#34;9月&amp;#34;, &amp;#34;10月&amp;#34;, &amp;#34;11月&amp;#34;, &amp;#34;12月&amp;#34; };

 //设置x轴刻度
 myPane.XAxis.Scale.TextLabels = labels;
 myPane.XAxis.Type = AxisType.Text;

 // 颜色填充
 myPane.Fill = new Fill(Color.White, Color.FromArgb(200, 200, 255), 45.0f);
 myPane.Chart.Fill = new Fill(Color.White, Color.LightGoldenrodYellow, 45.0f);

 pane.AxisChange(g);

 myPane.YAxis.Scale.Max += myPane.YAxis.Scale.MajorStep;
 BarItem.CreateBarLabels(myPane, false, &amp;#34;f0&amp;#34;); //在柱状图上方显示统计数
 }

 protected void btnQuerys_Click(object sender, EventArgs e)
 {
 GetData();
 }

 private DataTable GetData()
 {
 SqlHelper.ConnectionString =
 ConfigurationManager.AppSettings[&amp;#34;ConnectionString&amp;#34;].ToString();
 SqlParameter[] parameters = new SqlParameter[1];

 parameters[0] = new SqlParameter(&amp;#34;@Year&amp;#34;, SqlDbType.Int, 4);
 parameters[0].Value = this.txtYear.Value.Trim().Length == 0 ? DateTime.Now.Year :
 Convert.ToInt32(txtYear.Value.Trim());
 DataSet ds = SqlHelper.ExecuteDataset(&amp;#34;Counter_CounterYear&amp;#34;, parameters);
 if (ds != null &amp;amp;&amp;amp; ds.Tables.Count &amp;gt; 0 &amp;amp;&amp;amp; ds.Tables[0].Rows.Count &amp;gt; 0)
 {
 return ds.Tables[0];
 }
 else
 {
 return null;
 }
 }
 }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;4 在项目的根目录下创建一个名为ZedGraphImages的文件夹，只是作为ZedGraph绘图时的一个临时目录，并不会在该文件夹中生成图片，如果没有该文件夹会报异常。&lt;/p&gt;</description></item><item><title>Asp.net中递归实现CSS菜单</title><link>https://fwhyy.com/2009/04/aspnet-recursive-implementation-of-css-menu/</link><pubDate>Sat, 18 Apr 2009 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2009/04/aspnet-recursive-implementation-of-css-menu/</guid><description>&lt;p&gt;现在网络上有各种各样的非常漂亮的css菜单，不过大多都是静态的，菜单项都是在页面中写死的，这样就不是很灵活，每次要修改菜单都要去修改页面，下面就介绍一个从数据库中读取菜单项的动态css菜单的例子。&lt;/p&gt;</description></item><item><title>NHibernate入门级示例（增 删 改）</title><link>https://fwhyy.com/2009/01/an-introduction-to-the-sample-to-nhibernate/</link><pubDate>Tue, 20 Jan 2009 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2009/01/an-introduction-to-the-sample-to-nhibernate/</guid><description>&lt;p&gt;NHibernate相信大家都已非常熟悉，园子里有很多高手写了相关的系列文章，不过我还是NHibernate的一名初学者，在此将一个晚上学习成果分享一下，一个很简单的利用NHibernate实现增删改的例子。&lt;/p&gt;</description></item><item><title>Asp.net 2.0的Eval方法详解</title><link>https://fwhyy.com/2009/01/aspnet-2-0-the-eval-method-of-explanation/</link><pubDate>Wed, 14 Jan 2009 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2009/01/aspnet-2-0-the-eval-method-of-explanation/</guid><description>&lt;p&gt;实际上Eval方法是TemplateControl的，而System.Web.UI.Page和System.Web.UI.UserControl都继承于TemplateControl，所以我们可以在Page和UserControl上直接调用个方法。
Page.Eval方法可以帮助我们更好的撰写数据绑定表达式，在ASP.NET 1.x时代，数据绑定表达式的一般形式是：&lt;/p&gt;</description></item><item><title>Asp.Net 连接Access数据库</title><link>https://fwhyy.com/2009/01/aspnet-access-database-connection/</link><pubDate>Sat, 10 Jan 2009 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2009/01/aspnet-access-database-connection/</guid><description>&lt;p&gt;自学程序以来，一直使用的都是sqlserver数据库，最近帮一朋友做一个access的demo，发现在数据库的连接方面就存在很大差异，在web.config中配置好连接字符串，然后在后台取，在此我的做法是存两个值，将Provider和assess数据库文件的路径分开存，如下：&lt;/p&gt;</description></item><item><title>Response.Redirect在新窗口打开 &amp;&amp; 3.0扩展方法</title><link>https://fwhyy.com/2009/01/response-redirect-in-a-new-window-open-3-0-extension-methods/</link><pubDate>Wed, 07 Jan 2009 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2009/01/response-redirect-in-a-new-window-open-3-0-extension-methods/</guid><description>&lt;p&gt;Response.Rederect在默认情况下是在本页跳转，所以除了在js中用window.open 或是给A标签添加target属性之外，在后台似乎不能来打开新的页面，其实不然，通过设置form的target属性同样可以让Response.Rederect所指向的url在新的窗口打开。下面用三种方法来实现。&lt;/p&gt;</description></item><item><title>MasterPage 小谈</title><link>https://fwhyy.com/2008/12/masterpage-introduction/</link><pubDate>Sat, 06 Dec 2008 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2008/12/masterpage-introduction/</guid><description>&lt;h2 id="设置title"&gt;设置Title&lt;/h2&gt;
&lt;p&gt;1 如果想所有使用了masterpage的页面都是用一个title ，可以在masterpage页中设置title，并将内容页中的title去掉，否则内容页中的title会将masterpage中的title覆盖。&lt;/p&gt;</description></item><item><title>CheckBox全选终极方案</title><link>https://fwhyy.com/2008/10/the-ultimate-solution-checkbox-selection/</link><pubDate>Thu, 23 Oct 2008 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2008/10/the-ultimate-solution-checkbox-selection/</guid><description>&lt;p&gt;在我们的程序开发中经常会要用到CheckBox的全选，通常情况下是在一些数据绑定控件中如Gridview等&lt;/p&gt;</description></item><item><title>将服务器控件在后台生成html</title><link>https://fwhyy.com/2008/05/generate-html-server-controls-in-the-background/</link><pubDate>Wed, 28 May 2008 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2008/05/generate-html-server-controls-in-the-background/</guid><description>&lt;p&gt;这个方法很有用，在做一些Ajax应用的时候，可以在后台将gridview 生成hmtl后回传到客户端，可以实现分页的功能。&lt;/p&gt;</description></item><item><title>Asp.Net中 %= 与%# 的区别</title><link>https://fwhyy.com/2008/04/the-difference-between-the-and-aspnet/</link><pubDate>Thu, 03 Apr 2008 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2008/04/the-difference-between-the-and-aspnet/</guid><description>&lt;p&gt;&amp;lt;%= “oec2003” % &amp;gt; 相当于：Response.Write(“oec2003”);
&amp;lt;%# “oec2003” % &amp;gt; 相当于给变量赋值了oec2003&lt;/p&gt;
&lt;p&gt;在gridview中将一个绑定列转换成模板列时会看到有如下代码：&lt;/p&gt;</description></item><item><title>动态添加GridView行</title><link>https://fwhyy.com/2008/02/dynamically-add-tow-to-gridview/</link><pubDate>Fri, 15 Feb 2008 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2008/02/dynamically-add-tow-to-gridview/</guid><description>&lt;h2 id="c代码"&gt;C#代码:&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;span class="lnt"&gt;56
&lt;/span&gt;&lt;span class="lnt"&gt;57
&lt;/span&gt;&lt;span class="lnt"&gt;58
&lt;/span&gt;&lt;span class="lnt"&gt;59
&lt;/span&gt;&lt;span class="lnt"&gt;60
&lt;/span&gt;&lt;span class="lnt"&gt;61
&lt;/span&gt;&lt;span class="lnt"&gt;62
&lt;/span&gt;&lt;span class="lnt"&gt;63
&lt;/span&gt;&lt;span class="lnt"&gt;64
&lt;/span&gt;&lt;span class="lnt"&gt;65
&lt;/span&gt;&lt;span class="lnt"&gt;66
&lt;/span&gt;&lt;span class="lnt"&gt;67
&lt;/span&gt;&lt;span class="lnt"&gt;68
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c#" data-lang="c#"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Configuration&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Web&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Web.Security&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Web.UI&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Web.UI.WebControls&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Web.UI.WebControls.WebParts&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Web.UI.HtmlControls&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Data.SqlClient&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;partial&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;_Default&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Web&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UI&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Page&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="n"&gt;Page_Load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;object&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;EventArgs&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(!&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsPostBack&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;BindGrid&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="n"&gt;DataTable&lt;/span&gt; &lt;span class="n"&gt;ReadGridView&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;DataTable&lt;/span&gt; &lt;span class="n"&gt;dt&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;DataTable&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;DataRow&lt;/span&gt; &lt;span class="n"&gt;dr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Columns&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;DataColumn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ProductID&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;typeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Columns&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;DataColumn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ProductName&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;typeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Columns&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;DataColumn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;CategoryID&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;typeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GridView1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Rows&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Count&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;++)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;dr&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewRow&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;dr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GridView1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Rows&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;Cells&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Trim&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;dr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GridView1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Rows&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;Cells&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Trim&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;dr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GridView1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Rows&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;Cells&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Trim&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Rows&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dr&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="n"&gt;Button1_Click&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;object&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;EventArgs&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;DataTable&lt;/span&gt; &lt;span class="n"&gt;dt&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ReadGridView&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;//this.GridView1.DataSource = dt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;//this.GridView1.DataBind();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;DataRow&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewRow&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ItemArray&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;object&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;oec2003&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;oec2003&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;oec2003&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Rows&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;InsertAt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AcceptChanges&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GridView1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DataSource&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GridView1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DataBind&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="n"&gt;BindGrid&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ConfigurationManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ConnectionStrings&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;NorthwindConnectionString&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SqlConnection&lt;/span&gt; &lt;span class="n"&gt;con&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;SqlConnection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;SqlCommand&lt;/span&gt; &lt;span class="n"&gt;cmd&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;SqlCommand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;SELECT top 1 [ProductID], [ProductName], [CategoryID] FROM [Products]&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;con&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;SqlDataAdapter&lt;/span&gt; &lt;span class="n"&gt;sda&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;SqlDataAdapter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;DataSet&lt;/span&gt; &lt;span class="n"&gt;ds&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;DataSet&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sda&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ds&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GridView1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DataSource&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ds&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Tables&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;DefaultView&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GridView1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DataBind&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sda&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Dispose&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ds&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Dispose&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="html代码"&gt;Html代码&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;%@ Page Language=&amp;#34;C#&amp;#34; AutoEventWireup=&amp;#34;true&amp;#34; CodeFile=&amp;#34;Default.aspx.cs&amp;#34; Inherits=&amp;#34;_Default&amp;#34; %&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html PUBLIC &amp;#34;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;#34; 、
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt; &amp;#34;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;#34;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;html&lt;/span&gt; &lt;span class="na"&gt;xmlns&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;http://www.w3.org/1999/xhtml&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;head&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Head1&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;runat&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;title&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;无标题页&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;title&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;head&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;form2&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;runat&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;asp:Button&lt;/span&gt; &lt;span class="na"&gt;ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Button1&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;runat&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;server&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;OnClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Button1_Click&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;Text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Button&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;asp:GridView&lt;/span&gt; &lt;span class="na"&gt;ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;GridView2&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;runat&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;server&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;AutoGenerateColumns&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;False&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;DataKeyNames&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ProductID&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;Columns&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;asp:BoundField&lt;/span&gt; &lt;span class="na"&gt;DataField&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ProductID&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;HeaderText&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ProductID&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;InsertVisible&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;False&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;ReadOnly&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;True&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;SortExpression&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ProductID&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;asp:BoundField&lt;/span&gt; &lt;span class="na"&gt;DataField&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ProductName&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;HeaderText&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ProductName&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;SortExpression&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ProductName&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;asp:BoundField&lt;/span&gt; &lt;span class="na"&gt;DataField&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;CategoryID&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;HeaderText&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;CategoryID&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;SortExpression&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;CategoryID&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;Columns&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;asp:GridView&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;html&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="数据库连接字串"&gt;数据库连接字串&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;connectionStrings&amp;gt;
 &amp;lt;add name=&amp;#34;NorthwindConnectionString&amp;#34;
 connectionString=&amp;#34;Data Source=FENGWEI;Initial Catalog=Northwind;User ID=sa;Password=1234&amp;#34;
 providerName=&amp;#34;System.Data.SqlClient&amp;#34;/&amp;gt;
&amp;lt;/connectionStrings&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a href="http://files.cnblogs.com/oec2003/AddRow.rar"&gt;AddRow.rar&lt;/a&gt;&lt;/p&gt;</description></item><item><title>解决AJAX中使用UpdatePanel后再用Response.Write();无法弹出对话框问题</title><link>https://fwhyy.com/2008/01/updatepanel-issues/</link><pubDate>Sat, 19 Jan 2008 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2008/01/updatepanel-issues/</guid><description>&lt;p&gt;在AJAX支持的网站中使用想使用Response.Wrie(‘’); 或 Page. RegisterStartupScript (); 弹出一些提示对话框，没有效果。有如下三种解决方法：&lt;/p&gt;</description></item><item><title>类型“GridView”的控件 必须放在具有 runat=server 的窗体标记内 错误的解决方法</title><link>https://fwhyy.com/2007/12/type-of-the-gridview-controls-within-the-form-tag-must-be-placed-with-runat-equal-server-error-solution/</link><pubDate>Sun, 16 Dec 2007 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2007/12/type-of-the-gridview-controls-within-the-form-tag-must-be-placed-with-runat-equal-server-error-solution/</guid><description>&lt;h2 id="错误提示"&gt;错误提示:&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;类型“GridView”的控件 必须放在具有 runat=server 的窗体标记内&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="解决方法"&gt;解决方法:&lt;/h2&gt;
&lt;p&gt;在后台文件中重载VerifyRenderingInServerForm方法,如:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;public override void VerifyRenderingInServerForm(Control control)
{
 //base.VerifyRenderingInServerForm(control);
}
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>几个不同类型无刷新联动例子</title><link>https://fwhyy.com/2007/11/several-different-types-without-refresh-linkage-example/</link><pubDate>Fri, 30 Nov 2007 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2007/11/several-different-types-without-refresh-linkage-example/</guid><description>&lt;h2 id="iframe实现无刷新联动"&gt;Iframe实现无刷新联动&lt;/h2&gt;
&lt;p&gt;iframe的无刷新其实是局部刷新，状态栏的滚动条还是会滚动，只是页面不会闪烁，这是一种比较老的技术了，在处理的数据两大的时候会比较慢，在本例中需要两个页面：oec2003index.aspx和oec2003frame.asapx,oec2003index.aspx用来显示界面，其中有一个iframe标记，指向oec2003frame.aspx页用来显示结果&lt;/p&gt;</description></item><item><title>“无法在web服务器上启动调试,不具备调试此程序的权限” 问题解决</title><link>https://fwhyy.com/2007/11/unable-to-start-debugging-on-the-web-server-do-not-have-permission-to-debug-the-program-problem-solving/</link><pubDate>Wed, 28 Nov 2007 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2007/11/unable-to-start-debugging-on-the-web-server-do-not-have-permission-to-debug-the-program-problem-solving/</guid><description>&lt;p&gt;最近维护以前用03做的一个项目,又重新将03装上了，很久都没有用03了,装上后打开项目没有问题,但按F5运行却出现下面错误&lt;/p&gt;</description></item><item><title>GridView中实现CheckBox的全选</title><link>https://fwhyy.com/2007/11/to-realize-the-checkbox-selection-in-the-gridview/</link><pubDate>Fri, 09 Nov 2007 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2007/11/to-realize-the-checkbox-selection-in-the-gridview/</guid><description>&lt;h2 id="用服务器端的方法"&gt;用服务器端的方法&lt;/h2&gt;
&lt;p&gt;在页面上放一个gridview控件，配置好数据源，编辑列，添加一个模版列，再编辑模版，放入一个checkbox控件。代码如下：&lt;/p&gt;</description></item><item><title>Asp.Net Ajax—Calendar控件使用</title><link>https://fwhyy.com/2007/11/aspnet-ajax-calendar-control/</link><pubDate>Mon, 05 Nov 2007 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2007/11/aspnet-ajax-calendar-control/</guid><description>&lt;h2 id="简介"&gt;简介&lt;/h2&gt;
&lt;p&gt;Calendar控件是一个很简单的控件，主要用来在页面中提供日历的选择，其实现在已经有很多用javascript写的&lt;a href="http://blog.csdn.net/21aspnet/archive/2007/05/14/1607712.aspx"&gt;日历控件&lt;/a&gt;，但是Canlendar日历控件能够让我们更快速地来实现这种效果，只需要进行一些简单的设置即可。&lt;/p&gt;</description></item><item><title>Asp.Net Ajax-PopupControl控件使用</title><link>https://fwhyy.com/2007/09/asp-net-ajax-popupcontrol/</link><pubDate>Wed, 19 Sep 2007 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2007/09/asp-net-ajax-popupcontrol/</guid><description>&lt;h2 id="简介"&gt;简介&lt;/h2&gt;
&lt;p&gt;Popupcontrol可以弹出任意类型的控件，不管是在服务器控件还是html控件。就是在某控件获取焦点时弹出另外一个控件，进行一些操作后，隐藏弹出的控件。&lt;/p&gt;</description></item><item><title>Asp.Net Ajax-HoverMenu控件使用</title><link>https://fwhyy.com/2007/09/asp-net-ajax-hovermenu/</link><pubDate>Thu, 06 Sep 2007 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2007/09/asp-net-ajax-hovermenu/</guid><description>&lt;h2 id="简介"&gt;简介&lt;/h2&gt;
&lt;p&gt;通过名字我们可以看出这是一个菜单控件，当鼠标移动到指定的位置时，在不影响其他的元素的情况下出现一个菜单，并允许用户进行一些操作。&lt;/p&gt;</description></item><item><title>Asp.Net Ajax—ValidatorCallout控件使用</title><link>https://fwhyy.com/2007/09/asp-net-ajax-validatorcallout/</link><pubDate>Thu, 06 Sep 2007 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2007/09/asp-net-ajax-validatorcallout/</guid><description>&lt;h2 id="简介"&gt;简介&lt;/h2&gt;
&lt;p&gt;ValidatorCallout控件是一个用来绑定验证控件的提示控件,让验证的信息的显示可以更加地直观. 如下&lt;/p&gt;</description></item><item><title>Asp.Net Ajax-Passwordstrength控件使用</title><link>https://fwhyy.com/2007/08/asp-net-ajax-passwordstrength/</link><pubDate>Sat, 25 Aug 2007 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2007/08/asp-net-ajax-passwordstrength/</guid><description>&lt;h2 id="简介"&gt;简介&lt;/h2&gt;
&lt;p&gt;PasswordStrength控件是用来提示用户输入密码的情况,用户在密码框中输入密码时,在文本框的后面会有一个提示,显示密码的强度,这种提示有两种方式:文本和进度条,提示信息的位置也可以由我们来自己设置,样式可以写CSS来定义。当密码框失去焦点时提示信息会自动消失。下面就来看看该控件的重要属性吧。&lt;/p&gt;</description></item><item><title>Asp.Net Ajax—FilteredTextBox控件使用</title><link>https://fwhyy.com/2007/08/asp-net-ajax-filteredtextbox/</link><pubDate>Tue, 21 Aug 2007 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2007/08/asp-net-ajax-filteredtextbox/</guid><description>&lt;h2 id="简介"&gt;简介&lt;/h2&gt;
&lt;p&gt;FilterTextBox控件是一种文本框的过滤控件，可以阻止用户进行不准确的输入，相比较vs里提供的验证控件显得更为严格，验证控件是在用户输入了不准确的输入后，给出相应的提示，而现在要介绍的FilterTextBox都不给用户输入错误数据的机会。&lt;/p&gt;</description></item><item><title>Asp.Net Ajax —AutoComplete控件使用</title><link>https://fwhyy.com/2007/08/asp-net-ajax-autocomplete/</link><pubDate>Sat, 18 Aug 2007 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2007/08/asp-net-ajax-autocomplete/</guid><description>&lt;p&gt;以前见到google和迅雷等网站在搜索文本框中输入文字后能自动提示,感觉这种功能很炫也很实用.现在在学习asp.net ajax 发现AjaxControlToolKit工具包中的AutoComplete控件就能实现这种功能,而且非常简单.&lt;/p&gt;</description></item><item><title>AjaxControlToolkit安装&amp;下载</title><link>https://fwhyy.com/2007/08/ajaxcontroltoolkit-installing/</link><pubDate>Fri, 03 Aug 2007 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2007/08/ajaxcontroltoolkit-installing/</guid><description>&lt;p&gt;以下是收集关于AjaxControlToolkit安装的一篇文章，感谢原作者&lt;/p&gt;</description></item><item><title>解决Asp.Net Ajax UpdatePanel 乱码问题</title><link>https://fwhyy.com/2007/07/solve-the-problem-of-the-aspnet-ajax-updatepanel-garbled/</link><pubDate>Wed, 25 Jul 2007 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2007/07/solve-the-problem-of-the-aspnet-ajax-updatepanel-garbled/</guid><description>&lt;p&gt;UpdatePanel中当ContentComplate里面存在TextBox的时候会出现中文乱码&lt;/p&gt;
&lt;p&gt;一般存在这样两个解决方案：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在web.config里面增加下面代码。&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;globalization fileEncoding=&amp;#34;utf-8&amp;#34; requestEncoding=&amp;#34;utf-8&amp;#34;
 responseEncoding=&amp;#34;utf-8&amp;#34; culture=&amp;#34;zh-CN&amp;#34;/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Ajax,其实并不难</title><link>https://fwhyy.com/2007/07/ajax-actually-not-difficult/</link><pubDate>Mon, 23 Jul 2007 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2007/07/ajax-actually-not-difficult/</guid><description>&lt;p&gt;Ajax是一种应用技术的缩写，全称为&lt;code&gt;Asynchronous Javascript And XML &lt;/code&gt;,这种技术的使用可以更好地提高用户的体验。组成这种技术的主要因素有：&lt;code&gt;javascript&lt;/code&gt;语言，&lt;code&gt;css&lt;/code&gt;样式表，&lt;code&gt;XMLHttpRequest&lt;/code&gt;数据交换对象和&lt;code&gt;Dom&lt;/code&gt;对象。&lt;/p&gt;</description></item><item><title>实现鼠标悬停高亮显示—分别在gridview和datagrid中</title><link>https://fwhyy.com/2007/05/implement-mouseover-highlight-respectively-in-the-gridview-and-the-datagrid/</link><pubDate>Mon, 07 May 2007 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2007/05/implement-mouseover-highlight-respectively-in-the-gridview-and-the-datagrid/</guid><description>&lt;p&gt;在datagrid中的ItemDataBound事件中写如下代码：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;private void DataGrid1_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
 if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
 {
 e.Item.Attributes.Add(&amp;#34;onmouseover&amp;#34;, &amp;#34;c=this.style.backgroundColor;this.style.backgroundColor=&amp;#39;#66CCFF&amp;#39;&amp;#34;);
 e.Item.Attributes.Add(&amp;#34;onmouseout&amp;#34;, &amp;#34;this.style.backgroundColor=c&amp;#34;);
 }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;在girdview中的RowDataBound事件中写下如下代码：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
 if (e.Row.RowType == DataControlRowType.DataRow)
 {
 e.Row.Attributes.Add(&amp;#34;onmouseover&amp;#34;, &amp;#34;currentcolor=this.style.backgroundColor;this.style.backgroundColor=&amp;#39;#6699ff&amp;#39;;&amp;#34;);
 e.Row.Attributes.Add(&amp;#34;onmouseout&amp;#34;, &amp;#34;this.style.backgroundColor=currentcolor;&amp;#34;);
 }
}
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Asp.Net中水晶报表的简单使用</title><link>https://fwhyy.com/2007/01/simple-to-use-aspnet-in-crystal-reports/</link><pubDate>Thu, 11 Jan 2007 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2007/01/simple-to-use-aspnet-in-crystal-reports/</guid><description>&lt;p&gt;Crystal Reports是具有强大内容创建和集成功能的高效的报表技术，是第三方开发的报表工具，使用水晶报表我们可以更好地向用户展示数据。以前可以通过编程的方式将数据集中的数据进行处理后在windows应用程序或web应用程序中输出显示，但如果要做超出了基本格式化的一些工作如：求和、平均、多极汇总、制作图标等就会显得比较复杂，而水晶报表正好弥补了其中的不足。&lt;/p&gt;</description></item><item><title>Asp.Net中列表数据绑定控件浅析</title><link>https://fwhyy.com/2007/01/asp-net-lists-data-bound-controls/</link><pubDate>Wed, 03 Jan 2007 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2007/01/asp-net-lists-data-bound-controls/</guid><description>&lt;p&gt;在Asp.Net中用来显示列表数据的控件有&lt;code&gt;Repeater&lt;/code&gt;，&lt;code&gt;DataList&lt;/code&gt;,&lt;code&gt;DataGrid&lt;/code&gt;三种.&lt;/p&gt;
&lt;p&gt;DataGrid的灵活性很强，内置了丰富的事件，提供分页，编辑，排序等一些特性，对表格的操作也是非常方便的，而且还有很多种的风格可选，由于自带了很多的功能和特性，所以开发速度很快，容易部署。但它的性能不是很高，每次的操作都会返回到服务器。主要用在对有排序、分页、编辑和多列的显示，而且对性能的要求不是很高，一般情况下数据源是一个DateSet。&lt;/p&gt;</description></item><item><title>Asp.Net中的一个小的性能测试</title><link>https://fwhyy.com/2007/01/a-small-performance-test-of-asp-net/</link><pubDate>Wed, 03 Jan 2007 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2007/01/a-small-performance-test-of-asp-net/</guid><description>&lt;p&gt;大家都知道使用缓存可用大大提高asp.net应用程序的性能,那么究竟能提高多少性能呢?我做了一个小小的测试.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在vs2003中新建一个web应用程序,在页面上添加一个DataGrid控件，让DataGrid里显示NorthWind数据库中employees表的内容。我的做法是在vs2003的服务器资源管理器中建立一个连接到NorthWind数据库的连接，然后将其中的employees&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>Asp.Net的性能问题</title><link>https://fwhyy.com/2006/12/asp-net-performance-issues/</link><pubDate>Sat, 23 Dec 2006 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2006/12/asp-net-performance-issues/</guid><description>&lt;p&gt;性能对于一个应用程序来说是一个很重要的问题，在web的开发中也是一样，相信没有人愿意在电脑屏幕前花8秒钟来等待一个也面的打开，这就是常说的在web上的8秒钟原则。对于一个应用程序的性能我们应该把它当作是应用程序的一项功能，在设计的时候就应该处理好性能的问题，而不应该在整个程序开发完了以后再来进行优化，因为这样会付出更多的代价。&lt;/p&gt;</description></item></channel></rss>