<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>DotNet4 on 冯威的博客</title><link>https://fwhyy.com/tags/dotnet4/</link><description>Recent content in DotNet4 on 冯威的博客</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Sun, 02 Sep 2012 00:00:00 +0800</lastBuildDate><atom:link href="https://fwhyy.com/tags/dotnet4/atom.xml" rel="self" type="application/rss+xml"/><item><title>C# &amp; .NET 1.0-4.0</title><link>https://fwhyy.com/2012/09/c-net-1-0-4-0/</link><pubDate>Sun, 02 Sep 2012 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2012/09/c-net-1-0-4-0/</guid><description>&lt;p&gt;学习和使用.NET平台已有六七个年头了，05年开始学习.NET的时候，当时网上的资源不像现在这样丰富，所以去电脑城买了张盗版的VS2005的光盘，安装时才发现是VS2003，当时有一种被坑的感觉，但也正是如此，让我有了一个完整的.NET的学习生涯。&lt;/p&gt;
&lt;p&gt;从我从业的经历来看VS2003和VS2008是使用的比较多的，一些历史遗留的老项目由种种原因没有升级，依然在使用VS2003。我现在所在的公司也只使用VS2003和VS2008这两种开发工具，尽管TFS已经是2010了。很多时候公司觉得够用也就不去升级开发工具了。从1.0到4.0的变化主要体现在DotNet平台、语言和开发工具这三个方面。本文只是概括性的讲述在每个版本里都有些什么新的特性。先看下面的一张表格，描述的不同版本的出生年份、对应的VS版本和CLR的版本。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201290756052.webp" alt="2012-07-04_230408" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;上图中需要注意的一点是：2.0 3.0 3.5的CLR版本都是2.0。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;在1.1版本中，从语言的角度就是基本的面向对象的语法，可以说任何一般C#语言的书籍都包含了C#1的所有内容。工具方面VS2003已经很强大了，即便是到了现在的VS2012，我们80%时候用到的也只不过是20%的功能。&lt;/p&gt;
&lt;p&gt;在VS2003中创建ASP.NET项目默认是跟IIS相关联的，从VSS中拉VS2003的代码时需要先在IIS中创建好站点，端口要和VSS中代码的相对应，但有时会出现很多问题。我一般的做法是将代码拉到本地后，修改解决方案文件中的路径为本地路径，然后修改项目文件中的ProjectType为Local，默认是Web，就可以很顺利打开项目了。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2.0中对应VS2005我用的也不多，因为很快就被VS2008替代了，不过在语言方面却带来了很多新的东西。&lt;/p&gt;
&lt;p&gt;★C#2中最重要的一个特性应该就是泛型。泛型的用处就是在一些场景下可以减少强制转换来提高性能。在C#1中就有很多的强制转换，特别是对一些集合进行遍历时，如ArrayList、HashTable，因为他们是为不同数据类型设计的集合，所以他们中键和值的类型都是object，这就意味着会平凡发生装箱拆箱的才做。C#2中有了泛型，所以我们可以使用List&lt;T&gt;、Dictionary&amp;lt;Tkey,TValue&amp;gt; 。泛型能够带来很好的编译时类型检查，也不会有装箱拆箱的才做，因为类型是在使用泛型的时候就已经指定了。&lt;/p&gt;
&lt;p&gt;DotNet已经通过了很多的泛型类型供我们使用，如上面提到的List&lt;T&gt;,Dictionary&amp;lt;Tkey,TValue&amp;gt;,我们也可以自己来创建泛型类型(类、接口、委托、结构)或是方法。在定义泛型类型或时可以通过定义泛型约束来对泛型参数进行限制，更好的使用编译时检查。泛型约束是通过关键字where来实现的，C#2中的泛型约束有4种：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;引用类型约束：确保类型实参是引用类型，使用where T:class来表示；&lt;/li&gt;
&lt;li&gt;值类型约束：确保类型实参是值类型，使用where T:truct来表示；&lt;/li&gt;
&lt;li&gt;构造函数类型约束，使用where T:new()来表示；&lt;/li&gt;
&lt;li&gt;转换类型约束：约束类型实参是另外的一种类型，例如：where T:IDisposable 。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;★C#2提供了分部类（Partil）。分部类可以允许我们在多个文件中为一个类型编写代码，在Asp.Net2.0中用的极为广泛。新建一个Aspx页面，页面的CodeBehind和页面中的控件的定义就是通过分部类来实现的。如下：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;public partial class _Default : System.Web.UI.Page 
public partial class _Default 
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;分布类使用关键字partial来定义，当一个类中的代码非常多时，可以使用分部类来进行拆分，这对代码的阅读很有好处，而且不会影响调用。&lt;/p&gt;
&lt;p&gt;★C#2中增加了静态类，静态类中的公用方法必须也是静态的，可以由类名直接调用，不需要实例化，比较适用于编写一些工具类。如System.Math类就是静态类。工具类有一些特点，如：所有成员都是静态的、不需要被继承、不需要进行实例化。在C#1中我们可以通过如下代码来实现：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;//声明为密封类防止被继承 
public sealed class StringHelper
{
 //添加私有无参构造函ˉ数防止被实例化，如果不添加私有构造函数 //会自动生成共有无参构造函数 
 private StringHelper(){};
 public static int StringToInt32(string input)
 {
 int result=0;
 Int32.TryParse(input, out result);
 return result;
 }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;C#2中可以使用静态类来实现：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;public static class StringHelper
{
 public static int StringToInt32(string input)
 {
 int result=0;
 Int32.TryParse(input, out result);
 return result;
 }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;★在C#1中声明属性，属性中的get和set的访问级别是和属性一致，要么都是public要么都是private，如果要实现get和set有不同的访问级别，则需要用一种变通的方式，自己写GetXXX和SetXXX方法。在C#2中可以单独设置get和set的访问级别，如下：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;private string name;
public string Name
{
 get { return name; }
 private set { name = value; }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;需要注意的是，不能讲属性设置为私有的，而将其中的get或是set设置成公有的，也不能给set和get设置相同的访问级别，当set和get的访问级别相同时，我们可以直接设置在属性上。&lt;/p&gt;
&lt;p&gt;★命名空间可以用来组织类，当不同的命名空间中有相同的类时，可以使用完全限定名来防止类名的冲突，C#1中可以使用空间别名来简化书写，空间别名用using关键字实现，看下面一个例子:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;namespace NameSpaceDemo1
{
 public class ClassDemo{}
}
namespace NameSpaceDemo2
{
 public class ClassDemo{}
}
using Demo1 = NameSpaceDemo1;
using Demo2 = NameSpaceDemo2;
namespace WebApplication2
{
 public partial class _Default : System.Web.UI.Page 
 {
 protected void Page_Load(object sender, EventArgs e)
 {
 Demo1.ClassDemo c1 = new Demo1.ClassDemo();
 Demo2.ClassDemo c2 = new Demo2.ClassDemo();
 }
 }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;如果我们在使用中添加了名为Demo1或是Demo2的类，那么空间别名的使用就会受到影响，在C#1中就得使用完全限定名了。在C#2中可以用“::”符号来解决，如下面代码：&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>Net4.0—VS2010新特性</title><link>https://fwhyy.com/2010/05/net-4-vs2010-new-features/</link><pubDate>Thu, 27 May 2010 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2010/05/net-4-vs2010-new-features/</guid><description>&lt;p&gt;VS2010在用户体验上有了很大提升，可以让我们更方便和快捷地来进行编码工作。早在VS2010Beta版的时候，我曾写过&lt;a href="http://blog.fwhyy.com/2009/10/experience-vs2010-improvements/"&gt;一篇文章&lt;/a&gt;介绍VS2010的一些新特性，此文算是对那篇文章的补充吧。&lt;/p&gt;
&lt;h2 id="1-方便地删除recent-projects"&gt;1 方便地删除Recent Projects&lt;/h2&gt;
&lt;p&gt;如果用VS2010打开过项目，那么在启动VS2010后，在Start Page页面的Recent Projects列表中会有记录，之前的VS版本中如果想删除Recent Projects列表记录，需要修改注册表信息，参考&lt;a href="http://blog.fwhyy.com/index.php/2007/12/delete-recently-opened-in-visual-studio-project-and-file-records/"&gt;这里&lt;/a&gt;。在VS2010中可以很方便做到对Recent Projects列表的管理，在某一个项目名称上右击，弹出菜单中会有Remove From List选项，点击后会将当前项目名从列表中删除，如下图：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300735497.webp" alt="2010-05-26_155027" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h2 id="2-navigate-to"&gt;2 Navigate to&lt;/h2&gt;
&lt;p&gt;Navigate to搜索对话框可以让我们方便地查找内容，并且可以模糊匹配。输入[Ctrl+，] 快捷键便可以打开Nagigate to 对话框，如下图：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300735950.webp" alt="2010-05-27_104536" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;在Search terms框中输入关键词就可以进行模糊匹配，比如输入PL 就可以匹配到Page_Load事件，如下图：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300736023.webp" alt="2010-05-27_104755" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;双击结果中的方法名就可以导航到方法体中。&lt;/p&gt;
&lt;h2 id="3-同名函数的高亮显示"&gt;3 同名函数的高亮显示&lt;/h2&gt;
&lt;p&gt;在以前的VS版本中，要查找一个函数在页面中出现的次数或位置，有两种方法：Ctrl+F查找或是查找该函数的所有引用，这两种方法都不是很方便。在VS2010种新增了同名函数高亮显示功能，选中一个函数名，在同页中所有这个函数名出现的地方会高亮显示，如下图：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300736374.webp" alt="2010-05-27_103031" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h2 id="4-view-call-hierarchy"&gt;4 View Call Hierarchy&lt;/h2&gt;
&lt;p&gt;在一个方法名上右击，会有View Call Hierarchy选项，如下图：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300736242.webp" alt="2010-05-27_103504" 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/202201300736656.webp" alt="2010-05-27_111025" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;当然在VS2010中好玩的好用的新的功能肯定不止这些，让我们慢慢去发现吧！&lt;/p&gt;</description></item><item><title>Net4.0—Framwork新增特性</title><link>https://fwhyy.com/2010/05/net-4-framwork-of-new-features/</link><pubDate>Wed, 26 May 2010 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2010/05/net-4-framwork-of-new-features/</guid><description>&lt;h2 id="1-biginteger"&gt;1 BigInteger&lt;/h2&gt;
&lt;p&gt;BigInteger是Net4.0种System.Numerics命名空间下的一个新类，表示任意大小的带符号整数。像以前版本中的Int32，int64等这些都有MinValue和MaxValue属性，也就是说有大小的限制，而BigInteger没有大小的限制，所以理论上来说大数字足够大时可能会出现OutOfMemoryException异常。&lt;/p&gt;
&lt;p&gt;以一个例子来看看BigInteger，下面的例子是一个计算斐波那契的函数：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;public static int Fibonacci(int x)
{
 var preValue = -1;
 var curValue = 1;
 for (int i = 0; i &amp;lt;= x; ++i)
 {
 var sum = preValue + curValue;
 preValue = curValue;
 curValue = sum;
 }
 return curValue;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;上面的代码当x的值为47的时候就会出现溢出，结果如下图：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300729455.webp" alt="2010-05-26_105558" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;现在修改代码，使用BigInteger，代码如下：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;public static BigInteger Fibonacci(int x)
{
 var preValue = new BigInteger(-1);
 var curValue = new BigInteger(1);
 for (int i = 0; i &amp;lt;= x; ++i)
 {
 var sum = preValue + curValue;
 preValue = curValue;
 curValue = sum;
 }
 return curValue;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;再次将x赋值为47，运行结果如下图：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300729877.webp" alt="2010-05-26_111127" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h2 id="2-complex"&gt;2 Complex&lt;/h2&gt;
&lt;p&gt;Complex通BigInteger一样也是在System.Numerics命名空间下。简单说就是一个计算复数的类。看下面例子&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;private static void ComplexDemo()
{
 var z1 = new Complex(3, 4);
 var z2 = new Complex(5, 6);

 var r1 = Complex.Add(z1, z2);
 var r2 = Complex.Subtract(z1, z2);
 var r3 = Complex.Multiply(z1, z2);
 var r4 = Complex.Divide(z1, z2);

 Console.WriteLine(&amp;#34;Z1+Z2 :&amp;#34; + r1);
 Console.WriteLine(&amp;#34;Z1-Z2 :&amp;#34; + r2);
 Console.WriteLine(&amp;#34;Z1*Z2 :&amp;#34; + r3);
 Console.WriteLine(&amp;#34;Z1/Z2 :&amp;#34; + r4);
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;运行结果如下图：&lt;/p&gt;</description></item><item><title>体验vs2010 （功能改进篇）</title><link>https://fwhyy.com/2009/10/experience-vs2010-improvements/</link><pubDate>Sat, 24 Oct 2009 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2009/10/experience-vs2010-improvements/</guid><description>&lt;p&gt;下午在使用vs2010进行了一些简单的编码体验，下面谈一下和以前版本的一些不同的地方，仅限于工具的使用方面，有关Net4.0方面的知识将在以后深入研究。&lt;/p&gt;
&lt;p&gt;首先来看下创建项目的对话框，在左边的Installed Templates里多出了几个选项，如Cloud Service、F#等。点击左边栏中的C#，在右边的模板列表中可以看到Silverlight、asp.net mvc2 已经集成在其中了。而在在选择net framework 版本的下拉框的右边有一个排序的对话框，可以根据名称对模板列表进行排序。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300643854.webp" alt="2010-12-29_153755" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;作为一个web开发人员，当然是首先要试试asp.net web application了，点击C#下面的Web，可以在右边的模板列表中看到有Asp.net Web Application 和Empty Asp.net Web Application 两个Asp.net的模板，先来创建一个Asp.net Web Application 。会发现多了一些目录&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300643911.webp" alt="2010-12-29_153841" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;目录相对于以前的版本多了不少，而且还加入了jquery，乍一看好像是创建了Asp.net mvc项目。个人感觉在这些多出了目录用处也不是很多。如果觉得不需要这么多的自动创建的目录和文件可以选择创建Empty Asp.net Web Application 项目，这可是觉得干净的一个项目就只有一个Web.config文件&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300643074.webp" alt="2010-12-29_153930" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;说起Web.config文件，跟vs08里的Web.config文件实在是简化太多了，这个改进也是我非常喜欢的。Net4对应的CLR版本是4.0 以前的2.0、3.0.3.5的CLR版本都是2.0 ，所以Net4中的machine.config文件时和先前版本中的machine.config是并列安装的。新的.NET 4 machine.config文件现在自动注册我们以前所有的ASP.NET 标识部分（section）, 处理器和模块等。所以在项目中见到的Web.config文件时非常简洁的&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;?xml version=&amp;#34;1.0&amp;#34;?&amp;gt;
&amp;lt;configuration&amp;gt;

 &amp;lt;system.web&amp;gt;
 &amp;lt;compilation debug=&amp;#34;true&amp;#34; targetFramework=&amp;#34;4.0&amp;#34; /&amp;gt;
 &amp;lt;/system.web&amp;gt;
 &amp;lt;system.webServer&amp;gt;
 &amp;lt;modules runAllManagedModulesForAllRequests=&amp;#34;true&amp;#34;/&amp;gt;
 &amp;lt;/system.webServer&amp;gt;

&amp;lt;/configuration&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;在界面的编码框部分我发现了一个小细节，大家都知道我们可以以标签的形式打开很多的页面，在以前的版本中，关闭的小叉是在最右边，或者是直接再当前标签上点击右键选择关闭。在vs2010中每个标签页上都有一个关闭小叉叉，和现在很多的多标签浏览器类似，这样确实方便了不少。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300643127.webp" alt="2010-12-29_154008" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;现在就来开始编码的体验了，发现vs2010中的代码智能提示相对于以前版本的智能提示有了一个小的改进，不过这个小小的改进还是很有用的，比如在以前版本中输入一个Response会出现所有列表，而在vs2010中会对显示的内容进行过滤只显示和Response相关的。&lt;/p&gt;
&lt;p&gt;vs2008&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300643506.webp" alt="2010-12-29_154409" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;vs2010&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300644084.webp" alt="2009-10-24_221338" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;除了能过滤外还可以对关键词进行搜索，看下图就很清楚了，输入ind后就自动把TabIndex搜索出来了。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300644289.webp" alt="2010-12-29_154545" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;在智能提示中还有一种比骄有趣的功能，比如Textbox有BackColor和BorderColor属性，这两个属性都是由两个单词组成，是要输入每个单词的首字母就能将这两个属性过滤出来，如下图：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202201300644676.webp" alt="2009-10-24_223717" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;好了，先就写这么多吧，更多的功能还有待慢慢研究和使用。&lt;/p&gt;
&lt;p&gt;ps 该攒钱买本了啊，我这老爷本跑vs2010还是很吃力啊&lt;/p&gt;</description></item><item><title>体验VS2010（安装篇）</title><link>https://fwhyy.com/2009/10/experience-vs2010-installation/</link><pubDate>Sat, 24 Oct 2009 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2009/10/experience-vs2010-installation/</guid><description>&lt;p&gt;本来是打算等到vs2010正式版出来之后再安装vs2010体验，不过鉴于才2g多的大小，就提前下载安装了，下面的是安装过程中的一些截图。和以前装vs2008不同的是，在安装过程中，出现了两次重启电脑。必须重启后才能继续安装。安装的东西很多所以时间也比装vs2008长了不少。&lt;/p&gt;</description></item><item><title>Visual Studio 2010 Beta 2 公开下载地址</title><link>https://fwhyy.com/2009/10/visual-studio-2010-beta-2-download-address-publicly/</link><pubDate>Thu, 22 Oct 2009 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2009/10/visual-studio-2010-beta-2-download-address-publicly/</guid><description>&lt;p&gt;前天就在博客园见了lyj的那篇介绍Visual Studio 2010 Beta 2的文章了，今天终于开发下载了。
下载地址：&lt;a href="http://msdn.microsoft.com/en-us/vstudio/dd582936.aspx"&gt;http://msdn.microsoft.com/en-us/vstudio/dd582936.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;看了下别人的安装截图感觉漂亮了不少，不过我还是想等到正式版出来后再下载安装，希望到时能换一个配置好点的本本，现在的这个已经陪伴我三四年的老本跑起来确实很吃力啊。&lt;/p&gt;
&lt;h2 id="相关文章"&gt;相关文章&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://blog.fwhyy.com/2009/10/experience-vs2010-improvements/"&gt;体验vs2010 （功能改进篇）&lt;/a&gt;
&lt;a href="http://blog.fwhyy.com/2009/10/experience-vs2010-installation/"&gt;体验VS2010（安装篇）&lt;/a&gt;
&lt;a href="http://blog.fwhyy.com/2010/05/net-4-vs2010-new-features/"&gt;Net4.0—VS2010新特性&lt;/a&gt;
&lt;a href="http://blog.fwhyy.com/2010/07/net-4-data-bound-controls-the-clientidrowsuffix-properties/"&gt;Net4.0—数据绑定控件（GridView ListView…）中的ClientIDRowSuffix属性&lt;/a&gt;
&lt;a href="http://blog.fwhyy.com/2010/07/net-4-purification-processing-of-html/"&gt;Net4.0—对HTML净化的处理&lt;/a&gt;
&lt;a href="http://blog.fwhyy.com/2010/07/net-4-aspnet-controls-the-hyperlink-in-the-improvement/"&gt;Net4.0—AspNet中的控件HyperLink的改进（支持路由跳转）&lt;/a&gt;
&lt;a href="http://blog.fwhyy.com/2010/07/net-4-aspnet-url-rewriting-in-the-improvement/"&gt;Net4.0—AspNet中URL重写的改进&lt;/a&gt;
&lt;a href="http://blog.fwhyy.com/2010/06/net-4-the-web-deployment-tool/"&gt;Net4.0—Web部署工具&lt;/a&gt;
&lt;a href="http://blog.fwhyy.com/2010/05/net-4-framwork-of-new-features/"&gt;Net4.0—Framwork新增特性&lt;/a&gt;&lt;/p&gt;</description></item></channel></rss>