<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_丫头小静(Cathy)</title><subtitle type="text">在这个浮躁的年代，坚守一份执着与热情</subtitle><id>http://feed.cnblogs.com/blog/u/40567/rss</id><updated>2012-04-24T09:31:11Z</updated><author><name>丫头小静（Cathy）</name><uri>http://www.cnblogs.com/janes/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/janes/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/40567/rss"/><entry><id>http://www.cnblogs.com/janes/archive/2012/04/18/2455432.html</id><title type="text">正则表达式基础恶补</title><summary type="text">1.基本用途正则表达式两种基本用途：搜索和替换。2.单个字符匹配(.).字符可以匹配任何单个字符，类似于sql中的_。注意特殊字符匹配时要使用反斜杠\\。3.匹配一组字符([])[]之间的所有字符都是该集合的组成部分，字符集合的匹配结果是能够与集合中任何一个成员匹配的文本。字符-可以以字符区间的方式给出，例如：[0-9]等同于[0123456789]。常用的还有[a-zA-Z]。元字符^表明相对一个字符集和进行取非匹配，与逻辑非运算类似。4.元字符对元字符进行转义要用到\。如\[, \d, \]等。\d任何一个数字字符;\D任何一个非数字字符\w任何一个字母数字或下划线，等于[a-zA-Z0-</summary><published>2012-04-18T07:57:00Z</published><updated>2012-04-18T07:57:00Z</updated><author><name>丫头小静（Cathy）</name><uri>http://www.cnblogs.com/janes/</uri></author><link rel="alternate" href="http://www.cnblogs.com/janes/archive/2012/04/18/2455432.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/janes/archive/2012/04/18/2455432.html"/><content type="html">&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;1.基本用途&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;正则表达式两种基本用途：搜索和替换。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;2.单个字符匹配(.)&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;&lt;font style="background-color: #ffff00" color="#ff0000"&gt;.&lt;/font&gt;&lt;/strong&gt;字符可以匹配任何单个字符，类似于sql中的_。注意特殊字符匹配时要使用反斜杠\\。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;3.匹配一组字符([])&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;font style="background-color: #ffff00" color="#ff0000"&gt;[]&lt;/font&gt;&lt;/strong&gt;之间的所有字符都是该集合的组成部分，字符集合的匹配结果是能够与集合中任何一个成员匹配的文本。&lt;/li&gt;&lt;li&gt;字符&lt;font style="background-color: #ffff00"&gt;&lt;strong&gt;-&lt;/strong&gt;&lt;/font&gt;可以以字符区间的方式给出，例如：[0-9]等同于[0123456789]。常用的还有[a-zA-Z]。&lt;/li&gt;&lt;li&gt;元字符&lt;font style="background-color: #ffff00" color="#ff0000"&gt;&lt;strong&gt;^&lt;/strong&gt;&lt;/font&gt;表明相对一个字符集和进行取非匹配，与逻辑非运算类似。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;4.元字符&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;对元字符进行转义要用到&lt;font style="background-color: #ffff00" color="#ff0000"&gt;\&lt;/font&gt;。如\[, \d, \]等。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;font style="background-color: #ffff00"&gt;&lt;strong&gt;\d&lt;/strong&gt;&lt;/font&gt;任何一个数字字符;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;font style="background-color: #ffff00"&gt;\D&lt;/font&gt;&lt;/strong&gt;任何一个非数字字符&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;font style="background-color: #ffff00"&gt;\w&lt;/font&gt;&lt;/strong&gt;任何一个字母数字或下划线，等于[a-zA-Z0-9_]；&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;font style="background-color: #ffff00"&gt;\W&lt;/font&gt;&lt;/strong&gt;相当于[^a-zA-Z0-9_]&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;font style="background-color: #ffff00"&gt;\s&lt;/font&gt;&lt;/strong&gt;任何一个空白字符；&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;font style="background-color: #ffff00"&gt;\S&lt;/font&gt;&lt;/strong&gt;任何一个非空白字符。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;贪婪型or懒惰型&lt;/strong&gt;&lt;/p&gt;&lt;table style="color: #000000" border="0" cellspacing="0" cellpadding="2" width="400"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign="top" width="200"&gt;&lt;p align="center"&gt;&lt;strong&gt;贪婪型&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="200"&gt;&lt;p align="center"&gt;&lt;strong&gt;懒惰型&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="200"&gt;&lt;p align="center"&gt;+&amp;nbsp; &lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="200"&gt;&lt;p align="center"&gt;+?&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="200"&gt;&lt;p align="center"&gt;*&amp;nbsp; &lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="200"&gt;&lt;p align="center"&gt;*?&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="200"&gt;&lt;p align="center"&gt;{n,} &lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="200"&gt;&lt;p align="center"&gt;{n,}?&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp; 在防止过度匹配的情况下，可以使用懒惰型元字符。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;5.重复匹配&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;font style="background-color: #ffff00"&gt;&lt;strong&gt;+&lt;/strong&gt;&lt;/font&gt;匹配一个或多个字符；&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;font style="background-color: #ffff00"&gt;*&lt;/font&gt;&lt;/strong&gt;匹配零个或多个字符&lt;/li&gt;&lt;li&gt;&lt;font style="background-color: #ffff00"&gt;？&lt;/font&gt;匹配一个字符（或字符集合）的零次或者一次出现，表示可能出现或者不出现的情况。例如https?&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;font style="background-color: #ffff00"&gt;{n}&lt;/font&gt;&lt;/strong&gt;设定重复次数，把数值卸载他们中间即可。&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;font style="background-color: #ffff00"&gt;{m,n}&lt;/font&gt;&lt;/strong&gt;为重复匹配次数设定一个区间，例如{2,4}表示至少重复2次、最多重复4次。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;6.位置匹配&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;单词边界：&lt;strong&gt;&lt;font style="background-color: #ffff00"&gt;\b&lt;/font&gt;&lt;/strong&gt;限定符制定单词边界。如\bcat\b。&lt;/li&gt;&lt;li&gt;字符串边界：用&lt;strong&gt;&lt;font style="background-color: #ffff00"&gt;^&lt;/font&gt;&lt;/strong&gt;定义字符串开头，$定义字符串结尾。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ps：&lt;a title="正则测试工具" href="http://files.cnblogs.com/janes/RegExTester_JavaScript.zip"&gt;测试工具&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/janes/aggbug/2455432.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/janes/archive/2012/04/18/2455432.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/janes/archive/2012/04/03/2426796.html</id><title type="text">[译]Professional ASP.NET MVC3(03) - Chapter 1:Getting Started(下)</title><summary type="text">三、理解MVC应用程序结构使用Visual Studio创建一个新的ASP.NET MVC应用后，会自动为项目生成一些文件和目录，如图1-10所示.。 ASP.NET MVC项目默认有六个顶级目录，如表1-1所示。 表1-1：默认顶级目录 目录用途/Controllers用来放处理URL 请求的Controller类/Models用来放表示及操作数据业务对象的类/Views用来放负责表示输出（例如HTML）的用户界面模板文件的位置/Scripts放JavaScript库文件和脚本（.js）的位置/Content放置CSS,图片文件以及其他非动态或JavaScript的内容/App_Data..</summary><published>2012-04-03T04:26:00Z</published><updated>2012-04-03T04:26:00Z</updated><author><name>丫头小静（Cathy）</name><uri>http://www.cnblogs.com/janes/</uri></author><link rel="alternate" href="http://www.cnblogs.com/janes/archive/2012/04/03/2426796.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/janes/archive/2012/04/03/2426796.html"/><content type="html">&lt;p&gt;&lt;strong&gt;&lt;font size="2"&gt;三、理解MVC应用程序结构&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="2"&gt;使用Visual Studio创建一个新的ASP.NET MVC应用后，会自动为项目生成一些文件和目录，如图1-10所示.。 ASP.NET MVC项目默认有六个顶级目录，如表1-1所示。 &lt;/font&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201204/201204031222206659.png"&gt;&lt;font size="2"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/janes/201204/201204031222235772.png" width="278" height="436" /&gt;&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;p&gt;&lt;font size="2"&gt;&amp;nbsp; &lt;/font&gt;&lt;p&gt;&lt;font size="2"&gt;&lt;strong&gt;表1-1：默认顶级目录&lt;/strong&gt; &lt;/font&gt;&lt;table style="color: #000000" border="1" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign="top" width="111"&gt;&lt;p&gt;&lt;strong&gt;&lt;font size="2"&gt;目录&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="457"&gt;&lt;p&gt;&lt;strong&gt;&lt;font size="2"&gt;用途&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="111"&gt;&lt;p&gt;&lt;font size="2"&gt;/Controllers&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="457"&gt;&lt;p&gt;&lt;font size="2"&gt;用来放处理URL 请求的Controller类&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="111"&gt;&lt;p&gt;&lt;font size="2"&gt;/Models&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="457"&gt;&lt;p&gt;&lt;font size="2"&gt;用来放表示及操作数据业务对象的类&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="111"&gt;&lt;p&gt;&lt;font size="2"&gt;/Views&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="457"&gt;&lt;p&gt;&lt;font size="2"&gt;用来放负责表示输出（例如HTML）的用户界面模板文件的位置&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="111"&gt;&lt;p&gt;&lt;font size="2"&gt;/Scripts&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="457"&gt;&lt;p&gt;&lt;font size="2"&gt;放JavaScript库文件和脚本（.js）的位置&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="111"&gt;&lt;p&gt;&lt;font size="2"&gt;/Content&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="457"&gt;&lt;p&gt;&lt;font size="2"&gt;放置CSS,图片文件以及其他非动态或JavaScript的内容&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="111"&gt;&lt;p&gt;&lt;font size="2"&gt;/App_Data&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="457"&gt;&lt;p&gt;&lt;font size="2"&gt;用来存储想要读写的数据文件的位置&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;font size="2"&gt;&amp;nbsp; &lt;/font&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;&lt;font size="2"&gt;&lt;strong&gt;&lt;em&gt;假如我不喜欢这种目录结构该呢？&lt;/em&gt;&lt;/strong&gt; &lt;/font&gt;&lt;p&gt;&lt;font size="2"&gt;ASP.NET MVC并不强制要求使用该结构。事实上，开发人员在进行大型应用开发时会将应用程序划分为多个项目，从而使其更加方便管理（例如，数据模型类经常被分离出来，单独放置在一个类库项目中）。不过，默认生成的项目结构确实提供了不错的目录惯例，你可以通过使用它来保持清晰的应用程序关注点。&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;font size="2"&gt;&amp;nbsp; &lt;/font&gt;&lt;p&gt;&lt;font size="2"&gt;注意下面这些文件和目录。当你展开时： &lt;/font&gt;&lt;ul&gt;&lt;li&gt;&lt;font size="2"&gt;/Controller文件夹：你会发现Visual Studio默认向项目中添加了两个controller类&amp;#8212;&amp;#8212;HomeController和AccountController（图1-11）。 &lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201204/20120403122226492.png"&gt;&lt;font size="2"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/janes/201204/201204031222298177.png" width="289" height="417" /&gt;&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;font size="2"&gt;/Views文件夹：你会发现默认向项目中添加了三个子目录&amp;#8212;&amp;#8212;/Account, /Home, /Shared，以及里面包含的一些模板文件（如图1-12）。 &lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font size="2"&gt;/Content和/Sripts文件夹，你会发现用于控制整站HTML样式的Site.css文件，以及使项目支持jQuery的JavaScript类库（如图1-13）。 &lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201204/201204031222327257.png"&gt;&lt;font size="2"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/janes/201204/201204031222369336.png" width="250" height="516" /&gt;&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201203/201203311257003943.png"&gt;&lt;font size="2"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/janes/201203/201203311257018861.png" width="257" height="571" /&gt;&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="2"&gt;&amp;nbsp;&lt;/font&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;font size="2"&gt;MvcMusicStore.Tests项目:可以看到两个类，包含了关于Controller类的单元测试（见图1-14）。 &lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201204/201204031222381330.png"&gt;&lt;font size="2"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/janes/201204/201204031222408624.png" width="226" height="232" /&gt;&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="2"&gt;这些由Visual Studio添加的默认文件，为你提供了一个可用的应用程序的基本结构，结束时已经包含了主页，关于页面，账号登录、注销、注册页面，以及错误处理页面。 &lt;/font&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;ASP.NET MVC和惯用约定&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="2"&gt;ASP.NET MVC应用程序在很大程度默认依赖于惯用约定。它使开发人员能够避免进行一些可以基于约定推断出来的配置和定制等。 &lt;/font&gt;&lt;p&gt;&lt;font size="2"&gt;例如，MVC使用当处理view模板时，MVC使用基于约定的目录命名结构，这些约定使你在controller类引用view时忽略其物理路径。ASP.NET MVC默认会在项目的\Views[ControllerName]\文件夹查找view模板文件。 &lt;/font&gt;&lt;p&gt;&lt;font size="2"&gt;MVC是围绕着一些明显的基于约定默认值来设计的，当然如过需要的话可以被重写。这个概念通常被称作&amp;#8220;约定由于配置&amp;#8221;（convention over configure）。 &lt;/font&gt;&lt;p&gt;&lt;font size="2"&gt;&amp;nbsp; &lt;/font&gt;&lt;p&gt;&lt;font size="2"&gt;&lt;strong&gt;约定由于配置（Conventon over Configureation&lt;/strong&gt;&lt;strong&gt;）&lt;/strong&gt; &lt;/font&gt;&lt;p&gt;&lt;font size="2"&gt;约定由于配置的概念是在若干年前由Ruby on Rails流行而来的，主要含义是： &lt;/font&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;&lt;font size="2"&gt;&lt;em&gt;到现在为止，我们知道应该如何构建一个web&lt;/em&gt;&lt;em&gt;应用程序。那么我们来把这些经验融合到框架中，这样我们就不必每次都重新进行所有配置&lt;/em&gt;。 &lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;font size="2"&gt;&amp;nbsp; &lt;/font&gt;&lt;p&gt;&lt;font size="2"&gt;通过查看应用程序运行的三个核心文件夹，我们就可以在ASP.NET MVC的工作中发现此概念： &lt;/font&gt;&lt;ul&gt;&lt;li&gt;&lt;font size="2"&gt;Controllers &lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font size="2"&gt;Models &lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font size="2"&gt;Views &lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;font size="2"&gt;你不必在web.config文件中设置这些文件夹名称&amp;#8212;&amp;#8212;按照约定他们会在那里。这就省去了必须编写像web.config这样的XML文件的工作。例如，为了明确的告诉MVC引擎，&amp;#8220;你可以在Views路径找到我的views&amp;#8221;&amp;#8212;&amp;#8212;它已经知道了。这是一个约定。 &lt;/font&gt;&lt;p&gt;&lt;font size="2"&gt;&amp;nbsp; &lt;/font&gt;&lt;p&gt;&lt;font size="2"&gt;This isn&amp;#8217;t meant to be magical. Well, actually, it is; it&amp;#8217;s just not meant to be black magic &amp;#8212; &lt;/font&gt;&lt;a name="OLE_LINK3"&gt;&lt;font size="2"&gt;the kind of magic where you may not get the outcome you expected (and moreover can actually harm you)&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt;. ASP.NET MVC&amp;#8217;s conventions are pretty straightforward. This is what is expected of your application&amp;#8217;s structure: &lt;/font&gt;&lt;p&gt;&lt;font size="2"&gt;这并不是神乎其神的。不过，事实上它确实是。不过它并不是巫术&amp;#8212;&amp;#8212;从这种魔术那里可能得不到你所预期的结果（此外，还可能会伤害到你）。ASP.NET MVC中的约定是非常简单的，下面将是你的软件结构： &lt;/font&gt;&lt;ul&gt;&lt;li&gt;&lt;font size="2"&gt;每个Controller类命名都以&lt;em&gt;Controller&lt;/em&gt;结尾&amp;#8212;&amp;#8212;如ProductController、HomeController等，都存在于Controllers目录。 &lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font size="2"&gt;有一个单独的Views目录存放程序中所有的Views。 &lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font size="2"&gt;Controllers所使用的Views都在Views主目录下的子目录中，并且根据controller名称进行命名（去除&lt;em&gt;Controller&lt;/em&gt;后缀）。例如，前面提到的ProductController对应的view存在于 /Views/Product文件夹中。 &lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;font size="2"&gt;所有可共用的UI元素都以类似的结构存在，不过是在Views文件夹下的Shared目录中。在第3章中会了解更多关于Views的信息。 &lt;/font&gt;&lt;p&gt;&lt;font size="2"&gt;&amp;nbsp; &lt;/font&gt;&lt;p&gt;&lt;font size="2"&gt;&lt;strong&gt;约定简化沟通（Conventions Simplify Communication&lt;/strong&gt;&lt;strong&gt;）&lt;/strong&gt; &lt;/font&gt;&lt;p&gt;&lt;strong&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/strong&gt;&lt;p&gt;&lt;font size="2"&gt;你编写代码来进行表达和交流。主要要向两类不同的观众进行表述： &lt;/font&gt;&lt;ul&gt;&lt;li&gt;&lt;font size="2"&gt;你必须清楚明白地向计算机传到执行指令； &lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font size="2"&gt;想要开发者能够定位并阅读你的代码，以便于进行后续的维护、调试和扩展 &lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;font size="2"&gt;我们已经讨论了约定优于配置原则是如何帮你高效地向MVC表达你的意图的。约定还能使你清楚地同其他开发人员（包括今后自己）进行交流沟通。遵循通用的约定使全世界的MVC开发人员能够在所有的程序中具有共同的基准，这样就避免了对程序结构的每个方面进行反复的讲述。软件设计模式通常的优点之一是它建立了一个标准的语言。由于ASP.NET MVC应用了MVC模式，并且包含了一些自己的约定惯例，使得MVC开发人员即使在大型项目中也很容易看懂并非他们自己编写（或者不记得写过）的代码。&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font size="2"&gt;四、 总结&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="2"&gt;本章涉及面较广，首先从ASP.NET MVC简介开始，介绍了ASP.NET web框架和MVC软件模式如何融合成强大的系统来构建web应用程序。你可以看到ASP.NET MVC怎样经历两个版本而臻于成熟，较深入地介绍了ASP.NET MVC 3的特征和重点。基于这些基础，进行了开发环境的安装并且开始创建一个简单的MVC3应用。最后，查看了MVC 3应用程序的结构和构件。从第2章的Controllers开始，在后面的章节中我们会更加深入的了解这些组成部分的细节。 &lt;/font&gt;&lt;p&gt;&lt;font size="2"&gt;&lt;/font&gt;&amp;nbsp;&lt;p&gt;&lt;font size="2"&gt;注：参考书籍《Professional ASP.NET MVC3》，仅供学习和交流，请勿用于商业用途。&lt;/font&gt;&lt;p&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/janes/aggbug/2426796.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/janes/archive/2012/04/03/2426796.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/janes/archive/2012/03/30/2419022.html</id><title type="text">[译]Professional ASP.NET MVC3(02) - Chapter 1:Getting Started(中)</title><summary type="text">二、创建一个ASP.NET MVC3应用要了解MVC3是怎样工作的，最好的途径莫过于实际创建一个应用，那么我们开始吧。 ASP.NET MVC3软件需求MVC3可以在如下Windows客户端操作系统运行： Windows XP Windows Vista Windows 7 它可以运行在以下几种服务端操作系统上： Windows Server 2003 Windows Server 2008 Windows Server 2008 R2 MVC 3开发工具既可以安装在Visual Studio 2010上，也可以安装在Visual Web Developer 2010 Express.安装AS</summary><published>2012-03-30T04:40:00Z</published><updated>2012-03-30T04:40:00Z</updated><author><name>丫头小静（Cathy）</name><uri>http://www.cnblogs.com/janes/</uri></author><link rel="alternate" href="http://www.cnblogs.com/janes/archive/2012/03/30/2419022.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/janes/archive/2012/03/30/2419022.html"/><content type="html">&lt;p&gt;&lt;strong&gt;&lt;font size="2"&gt;二、创建一个ASP.NET MVC3应用&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="2"&gt;要了解MVC3是怎样工作的，最好的途径莫过于实际创建一个应用，那么我们开始吧。 &lt;/font&gt;&lt;/p&gt;&lt;font size="2"&gt;&lt;hr /&gt;&lt;/font&gt;&lt;p&gt;&lt;strong&gt;&lt;font size="2"&gt;&lt;strong&gt;ASP.NET MVC3&lt;/strong&gt;&lt;strong&gt;软件需求&lt;/strong&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="2"&gt;MVC3可以在如下Windows客户端操作系统运行： &lt;/font&gt;&lt;ul&gt;&lt;li&gt;&lt;font size="2"&gt;Windows XP &lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font size="2"&gt;Windows Vista &lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font size="2"&gt;Windows 7 &lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;font size="2"&gt;它可以运行在以下几种服务端操作系统上： &lt;/font&gt;&lt;ul&gt;&lt;li&gt;&lt;font size="2"&gt;Windows Server 2003 &lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font size="2"&gt;Windows Server 2008 &lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font size="2"&gt;Windows Server 2008 R2 &lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;font size="2"&gt;MVC 3开发工具既可以安装在Visual Studio 2010上，也可以安装在Visual Web Developer 2010 Express.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font size="2"&gt;&lt;strong&gt;安装&lt;/strong&gt;&lt;strong&gt;ASP.NET MVC3&lt;/strong&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="2"&gt;确认满足了基本的软件需求后，到时间该在你的开发机器和产品机器上安装ASP.NET MVC3了。值得庆幸的是，这相当简单。 &lt;/font&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;/em&gt;&lt;/strong&gt;&lt;font size="2"&gt;&lt;strong&gt;&lt;em&gt;和&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;MVC2&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;并行安装&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;&lt;/em&gt;&lt;/strong&gt; &lt;/font&gt;&lt;hr /&gt;&lt;p&gt;&lt;font size="2"&gt;MVC 3和MVC 2是可以并列安装的，因此你可以安装并立即开始使用MVC3。你仍然可以像往常一样创建和更新已经存在的MVC2应用程序。 &lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;font size="2"&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;安装&lt;/strong&gt;&lt;strong&gt;MVC3&lt;/strong&gt;&lt;strong&gt;开发组件&lt;/strong&gt;&lt;/font&gt;&lt;strong&gt;&lt;/strong&gt; &lt;/font&gt;&lt;p&gt;&lt;font size="2"&gt;ASP.NET MVC3开发者工具支持Visual Studio 2010或者Visual Web Developer 2010 Express(免费)。 &lt;/font&gt;&lt;p&gt;&lt;font size="2"&gt;安装MVC3，可以使用Web Platform Installer (&lt;/font&gt;&lt;a href="http://www.microsoft.com/web/gallery/install.aspx?appid=MVC3"&gt;&lt;font size="2"&gt;http://www.microsoft.com/web/gallery/install.aspx?appid=MVC3&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt;),或者可执行安装包( &lt;/font&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkID=208140"&gt;&lt;font size="2"&gt;http://go.microsoft.com/fwlink/?LinkID=208140&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt;)。我一般比较倾向于使用Web Platform Installer,因为它只下载和安装目前没有的组件。可执行安装包可以离线运行，它包含了所有需要的东西。 &lt;/font&gt;&lt;p&gt;&lt;font size="2"&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;服务器安装&lt;/strong&gt;&lt;strong&gt;MVC 3&lt;/strong&gt;&lt;/font&gt; &lt;/font&gt;&lt;p&gt;&lt;font size="2"&gt;安装包会检测它是否运行在不必支持开发环境的机器上，而且只需安装服务端部分。假如你的服务器是可以访问网络的，WebPI是一个轻量级的安装，因为没有必要安装任何开发者工具。 &lt;/font&gt;&lt;p&gt;&lt;font size="2"&gt;当在服务器上安装MVC3时，MVC运行时程序集是被安装在全局程序集缓存（GAC）中，这意味着该服务器上的所有网站都可以使用。另外一种方式是，根本不在服务器上安装MVC 3，而是在你的应用程序中包含所需的程序集，这种处理方式叫做二进制部署（bin deployment），实现方式是在项目引用中添加下列程序集，并在Visual Studio属性中将其设置为&amp;#8220;本地&amp;#8221;（Copy Local）。 &lt;/font&gt;&lt;ul&gt;&lt;li&gt;&lt;font size="2"&gt;&amp;nbsp; Microsoft.Web.Infrastructure &lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font size="2"&gt;&amp;nbsp; System.Web.Helpers &lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font size="2"&gt;&amp;nbsp; System.Web.Mvc &lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font size="2"&gt;&amp;nbsp; System.Web.Razor &lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font size="2"&gt;&amp;nbsp; System.Web.WebPages &lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font size="2"&gt;&amp;nbsp; System.Web.WebPages.Deployment &lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font size="2"&gt;&amp;nbsp; System.Web.WebPages.Razor &lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;font size="2"&gt;要想获取关于安装选项的更多信息，请查看Scott Guthrie的博客，名为&amp;#8220;Running an ASP.NET MVC 3 app on a web server that doesn&amp;#8217;t have ASP.NET MVC 3 installed,&amp;#8221;，链接地址为：http://weblogs.asp.net/scottgu/archive/2011/01/18/running-an-asp-net-mvc-3-app-on-a-web-server-that-doesn-t-have-asp-net-mvc-3-installed.aspx.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font size="2"&gt;&lt;strong&gt;创建一个&lt;/strong&gt;&lt;strong&gt;ASP.NET MVC3&lt;/strong&gt;&lt;strong&gt;应用程序&lt;/strong&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="2"&gt;安装MVC 3之后，会发现Visual Studio 2010和Visual Web Developer2010都有了一些新的选项。两个IDE中的这些体验都是及其相似的，由于本书属于高级系列教程，我们将会主要以Visual Studio 开发环境为主，只在当两者区别较大的时候才会提到Visual Web Developer。 &lt;/font&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;&lt;font size="2"&gt;&lt;font color="#333333"&gt;&lt;strong&gt;&lt;em&gt;MVC &lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;音乐商店&lt;/em&gt;&lt;/strong&gt;&lt;/font&gt;&lt;strong&gt;&lt;em&gt;&lt;/em&gt;&lt;/strong&gt; &lt;hr /&gt;&lt;/font&gt;&lt;p&gt;&lt;font size="2"&gt;我们会使用基于MVC音乐商店博客的一些例子，这些例子的在线地址是：&lt;/font&gt;&lt;a href="http://mvcmusicstore.codeplex.com/"&gt;&lt;font size="2"&gt;http://mvcmusicstore.codeplex.com&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt;，并且包含150页的电子教程来讲解MVC3应用程序的构建基础。本书中我们会稍微快一些，&lt;u&gt;&lt;font style="background-color: #ffff00"&gt;不过如果你需要更多关于介绍性话题的信息，好在他们有一个共同的起点&lt;/font&gt;&lt;/u&gt;（&lt;/font&gt;but it&amp;#8217;s nice to have a common base if you need more information on the introductory topics &lt;font size="2"&gt;）。 &lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;font size="2"&gt;我们来新建一个MVC项目： &lt;/font&gt;&lt;p&gt;&lt;font size="2"&gt;1.开始先选择File-&amp;gt;New-&amp;gt;Project，如图1-2所示。 &lt;/font&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201203/201203270938498629.jpg"&gt;&lt;font size="2"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://images.cnblogs.com/cnblogs_com/janes/201203/201203270938496960.jpg" width="558" height="432" /&gt;&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="2"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;font size="2"&gt;2. 如下图所示，在新建项目对话框左侧列的模板部分，选择Visual C#-&amp;gt;Web模板列。在中间列会显示web应用类型的列表。 &lt;/font&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201203/201203270938498879.jpg"&gt;&lt;font size="2"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image004" border="0" alt="clip_image004" src="http://images.cnblogs.com/cnblogs_com/janes/201203/201203270938503514.jpg" width="557" height="341" /&gt;&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="2"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;font size="2"&gt;3. 选择ASP.NET MVC3 web应用程序，将应用程序命名为MvcMusicStore，单击OK。&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="2"&gt;&amp;nbsp;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font size="2"&gt;新的ASP.NET MVC3对话框&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="2"&gt;创建新的MVC3应用之后会看到一个对话框，包含项目创建过程中的一些具体的MVC选项，如图1-4所示。在对话框中勾选的选项将为你的应用程序生成一些具体的底层结构，包含账号管理、view引擎以及测试等。 &lt;/font&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201203/201203301235024168.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/janes/201203/201203301235029642.png" width="562" height="546" /&gt;&lt;/a&gt; &lt;p&gt;&amp;nbsp; &lt;p&gt;&lt;font size="2"&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;应用程序模板（&lt;/strong&gt;&lt;strong&gt;Application Templates&lt;/strong&gt;&lt;strong&gt;）&lt;/strong&gt;&lt;/font&gt;&lt;strong&gt;&lt;/strong&gt; &lt;/font&gt;&lt;p&gt;&lt;font size="2"&gt;首先，要在预先安装的两种项目模板中进行选择（如图1-4）。 &lt;/font&gt;&lt;ul&gt;&lt;li&gt;&lt;font size="2"&gt;&amp;nbsp;&lt;strong&gt;The Internet Application template&lt;/strong&gt;：该模板包含了MVC web 应用程序的基本内容，创建完成后可以立即运行并看到一些页面。只需要短短一分钟时间就可以完成这些。该模板还包含了一些基本的账号管理功能，它对应着ASP.NET Membership系统（第7章中会讨论到）。 &lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;&lt;font size="2"&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp; ASP.NET MVC3&lt;/em&gt;&lt;em&gt;更新工具中还添加了&lt;/em&gt;&lt;em&gt;Intranet Application template&lt;/em&gt;&lt;em&gt;，但它的账号管理功能不是针对&lt;/em&gt;&lt;em&gt;ASP.NET membership&lt;/em&gt;&lt;em&gt;系统，而是关于&lt;/em&gt;&lt;em&gt;windows&lt;/em&gt;&lt;em&gt;账号。&lt;/em&gt;&lt;em&gt;&lt;/em&gt; &lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;em&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/em&gt;&lt;ul&gt;&lt;li&gt;&lt;font size="2"&gt;&amp;nbsp;&lt;strong&gt;The Empty te&lt;/strong&gt;&lt;strong&gt;mplate:&lt;/strong&gt;这个模板基本上是空的。它也包含了基本的文件夹、CSS和MVC应用的基本架构，但是仅此而已。直接运行用空模板创建的应用将会看到错误信息&amp;#8212;&amp;#8212;&lt;u&gt;&lt;font style="background-color: #ffffff"&gt;你需要从头开始一步步进行开发工作&lt;/font&gt;&lt;/u&gt;（&lt;font style="background-color: #ffff00"&gt;you need to work just to get to square one&lt;/font&gt;）。既然如此，那为什么还要将该模板包含进来呢？其实空模板是为了方便经验丰富的MVC开发人员更精确的按照自己的需要来进行设置和配置。我们将会在本章后半部分简略的看一下空应用程序的结构。要想了解更多，可以参考一下MVC音乐商店的应用程序，它就是用空模板创建的。&lt;strong&gt;&lt;/strong&gt; &lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/strong&gt;&lt;p&gt;&lt;font size="2"&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;View&lt;/strong&gt;&lt;strong&gt;引擎（&lt;/strong&gt;&lt;strong&gt;View Engine&lt;/strong&gt;&lt;strong&gt;）&lt;/strong&gt;&lt;/font&gt;&lt;strong&gt;&lt;/strong&gt; &lt;/font&gt;&lt;p&gt;&lt;font size="2"&gt;在新的ASP.NET MVC3项目对话框中，接下来的选项是view引擎下拉框。View引擎提供了不同的模板语言用来生成MVC项目中的HTML标签。在MVC3之前的版本中，view引擎唯一的集成选项是ASPX或者说Web Forms。这个选项依然是可用的，如图1-5所示。&lt;/font&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201203/201203301235031560.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/janes/201203/201203301235035115.png" width="250" height="150" /&gt;&lt;/a&gt; &lt;p&gt;&amp;nbsp; &lt;p&gt;&lt;font size="2"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/font&gt;&lt;p&gt;&lt;strong&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/strong&gt;&lt;p&gt;&lt;font size="2"&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;测试（&lt;/strong&gt;&lt;strong&gt;Testing&lt;/strong&gt;&lt;strong&gt;）&lt;/strong&gt;&lt;/font&gt;&lt;strong&gt;&lt;/strong&gt; &lt;/font&gt;&lt;p&gt;&lt;font size="2"&gt;如果使用了Internet或者Intranet应用程序模板，那么在新的ASP.NET MVC3项目对话框中会有另外一个选项。该部分主要处理测试，如图1-6所示。&lt;/font&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201203/201203301235033446.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/janes/201203/201203301235043413.png" width="540" height="179" /&gt;&lt;/a&gt; &lt;p&gt;&lt;font size="2"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/font&gt;&lt;p&gt;&lt;font size="2"&gt;如果不选中创建测试项目的复选框，那么意味着你的项目创建时不会包含任何单元测试，也就没有其他的需要做了。 &lt;/font&gt;&lt;/p&gt;&lt;table style="color: #000000" border="0" cellspacing="0" cellpadding="2" width="1017"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign="top" width="1015"&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;&lt;font size="2"&gt;&lt;em&gt;&lt;strong&gt;推荐：选中复选框&lt;/strong&gt;&lt;/em&gt; &lt;/font&gt;&lt;p&gt;&lt;font size="2"&gt;我希望你会形成对每个新建项目都选中&amp;#8220;创建单元测试项目&amp;#8221;复选框的习惯。 &lt;/font&gt;&lt;p&gt;&lt;font size="2"&gt;我并不打算向你兜售&amp;#8220;单元测试&amp;#8221;信仰 &amp;#8212; 至少现在还不。整个这本书中我们都会谈论单元测试，特别是第12章，会涉及单元测试及可测试模式，但我们并不打算把它强行塞入你的喉咙（让你生吞活剥）。&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="2"&gt;因此，我的推销（建议）是：只选中这个复选框。你（暂时）不必知道这么做的细节，也不需要你具有一个ALT.NET的粉饰或一份证书（意即，你现在不需要具备单元测试的任何基础知识）。本书中我们会涉及一些单元测试以让你入门，而单元测试最好的起步就是选中这个复选框，以便你以后可以编写一些测试而不必做任何设置。&lt;br /&gt;&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;font size="2"&gt;在选中创建单元测试项目复选框（Create a Unit Test Project box）之后，会有两外几个选项： &lt;/font&gt;&lt;ul&gt;&lt;li&gt;&lt;font size="2"&gt;第一个很简单：你可以任意修改单元测试项目的名称； &lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font size="2"&gt;第二个选项允许选择一个测试框架，如图1-7所示。&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201203/201203301235074686.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/janes/201203/201203301235078557.png" width="505" height="203" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;font size="2"&gt;&amp;nbsp;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="2"&gt;你可能已经注意到，只有一个测试框架供选择，这看起来好像没有太大必要了。只有一个下拉框选项是因为单元测试框架式可以注册到该对跨框中的，所以如果你安装了其他单元测试框架（如xUnit, Nunit, MbUnit等），那么将会显示在该下拉框列表中。 &lt;/font&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;&lt;font size="2"&gt;&lt;em&gt;Visual Studio Unit Test Framework&lt;/em&gt;&lt;em&gt;只在&lt;/em&gt;&lt;em&gt;Visual Studio &lt;/em&gt;&lt;em&gt;专业版或者更高版本中可用。如果你使用&lt;/em&gt;&lt;em&gt;Visual Studio 2010&lt;/em&gt;&lt;em&gt;标准版或者&lt;/em&gt;&lt;em&gt;Visual Web Developer 2010 &lt;/em&gt;&lt;em&gt;企业版，那么你需要下载安装&lt;/em&gt;&lt;em&gt;ASP.NET MVC&lt;/em&gt;&lt;em&gt;的&lt;/em&gt;&lt;em&gt;Nunit, MbUnit&lt;/em&gt;&lt;em&gt;或者&lt;/em&gt;&lt;em&gt;Xunit&lt;/em&gt;&lt;em&gt;扩展包才可以看到这个对话框。&lt;/em&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="2"&gt;&lt;em&gt;&lt;/em&gt;&amp;nbsp;&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;&lt;font size="2"&gt;&lt;strong&gt;&lt;em&gt;为单元测试框架下拉框注册测试框架&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;&lt;/em&gt;&lt;/strong&gt; &lt;/font&gt;&lt;hr /&gt;&lt;p&gt;&lt;font size="2"&gt;可曾想过为新的MVC新建项目对话框注册测试框架要涉及到哪些吗？ &lt;/font&gt;&lt;p&gt;&lt;font size="2"&gt;该过程在MSDN上进行了详细的描述(&lt;/font&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/dd381614.aspx"&gt;&lt;font size="2"&gt;http://msdn.microsoft.com/en-us/library/dd381614.aspx&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt;)。主要包括两个步骤： &lt;/font&gt;&lt;p&gt;&lt;font size="2"&gt;1. 为新的MVC测试项目创建并安装模板项目； &lt;/font&gt;&lt;p&gt;&lt;font size="2"&gt;2. 通过在HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\10.0_Config\MVC3\TestProjectTemplates下添加一些注册表项来注册测试项目类型。 &lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;font size="2"&gt;检查并确认你的信件MVC 3应用程序对话框中的设置和图1-8中一致，然后单击确定。 &lt;/font&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201203/201203301235081523.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/janes/201203/201203301235092013.png" width="562" height="536" /&gt;&lt;/a&gt; &lt;p&gt;&amp;nbsp; &lt;p&gt;&lt;font size="2"&gt;这样就创建了包含两个项目的解决方案&amp;#8212;&amp;#8212;其中一个是web应用程序，另外一个是单元测试项目，如图1-9所示。&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201203/201203301235108882.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/janes/201203/201203301235101291.png" width="562" height="428" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;font size="2"&gt;&lt;/font&gt;&amp;nbsp;&lt;p&gt;&lt;font size="2"&gt;注：参考书籍《Professional ASP.NET MVC3》，仅供学习和交流，请勿用于商业用途。&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/janes/aggbug/2419022.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/janes/archive/2012/03/30/2419022.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/janes/archive/2012/03/26/2418123.html</id><title type="text">[译]Professional ASP.NET MVC3(01)-Chapter 1:Getting Started(上)</title><summary type="text">本章概要 理解ASP.NET MVCASP.NET MVC3 预览如何创建MVC3应用程序MVC应用程序结构 本章首先简要介绍ASP.NET MVC, 解释它怎样适应ASP.NET MVC的历史版本，总结ASP.NET MVC3的主要更新，并展示如何配置ASP.NET MVC3应用程序的开发环境。 鉴于本书是介绍某web框架的高级系列教程之一，因此将介绍的言简意赅。我们不打算花费过多的时间来说服您来学习ASP.NET MVC,而是假设您已经为此而购买了本书。要想证明一个软件框架和模式成功，最好的方式莫过于展示它在现实世界中的应用。 ASP.NET MVC简介 ASP.NET MVC是将Mode</summary><published>2012-03-26T09:06:00Z</published><updated>2012-03-26T09:06:00Z</updated><author><name>丫头小静（Cathy）</name><uri>http://www.cnblogs.com/janes/</uri></author><link rel="alternate" href="http://www.cnblogs.com/janes/archive/2012/03/26/2418123.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/janes/archive/2012/03/26/2418123.html"/><content type="html">&lt;p&gt;&lt;strong&gt;本章概要&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt; &lt;ul&gt;&lt;li&gt;理解ASP.NET MVC&lt;/li&gt;&lt;li&gt;ASP.NET MVC3 预览&lt;/li&gt;&lt;li&gt;如何创建MVC3应用程序&lt;/li&gt;&lt;li&gt;MVC应用程序结构 &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;本章首先简要介绍ASP.NET MVC, 解释它怎样适应ASP.NET MVC的历史版本，总结ASP.NET MVC3的主要更新，并展示如何配置ASP.NET MVC3应用程序的开发环境。&amp;nbsp; &lt;p&gt;鉴于本书是介绍某web框架的高级系列教程之一，因此将介绍的言简意赅。我们不打算花费过多的时间来说服您来学习ASP.NET MVC,而是假设您已经为此而购买了本书。要想证明一个软件框架和模式成功，最好的方式莫过于展示它在现实世界中的应用。 &lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;strong&gt;&lt;strong&gt;ASP.NET MVC&lt;/strong&gt;&lt;strong&gt;简介&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt; &lt;/strong&gt;&lt;/p&gt;&lt;p&gt;ASP.NET MVC是将Model-View-Controller模式应用到ASP.NET 框架，而形成的搭建web应用的架构。我们首先看一下ASP.NET MVC和ASP.NET 框架的关系，然后再逐个难点进行突破。 &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;ASP.NET MVC&lt;/strong&gt;&lt;strong&gt;怎样适应&lt;/strong&gt;&lt;strong&gt;ASP.NET&lt;/strong&gt; &lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;自从2002年发布ASP.NET 1.0以来，人们很容易把ASP.NET 和Web Forms看做一回事。ASP.NET 通常支持两个抽象层： &lt;ul&gt;&lt;li&gt;System.Web.UI: Web窗体层。包括服务端控件，View State等；&lt;/li&gt;&lt;li&gt;System.Web：管道。提供基本的web堆栈，包括models, handlers,以及HTTP堆等。 &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;ASP.NET的主要开发方法是有一系列的web表单堆叠而成的-通过拖拽控件，魔术式的状态管理，以及后台编译时神奇的服务端控件处理（但经常混淆页面生命周期，不够优化的HTML,等等）。 &lt;p&gt;但是，有些可能性还是存在的&amp;#8212;&amp;#8212;直接响应HTTP请求，按照web框架真正的工作方式来进行构建，以及通过Handlers,Modules或其他手写代码来编写优雅的HTML代码。你可以实现，但是十分复杂，因为没有任何内建的模式来支持这些。但是，在更广范围的计算机科学界是不乏设计模式的。自从2007年发布ASP.NET MVC以来，ASP.NET MVC正在逐渐成为最流行的web开发框架之一。 &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;MVC&lt;/strong&gt;&lt;strong&gt;模式&lt;/strong&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Model-View-Controller(MVC)多年来一直是重要的设计模式之一。1979年时最初被称作Tbing-Model-View-Editor，后来简称Model-View-Controller。它是用来分离应用程序关注点的强有力的方法（例如，将数据访问层和展示逻辑分离开来），并能极好地适用于web应用程序。很明显，分离关注点将会为应用程序的设计添加些许额外的复杂度，但肯定是利大于弊。自从发布以来已经应用于许多框架中，可以看到，无论在Java还是C++, Mac还是Windows，它已经渐渐融入了诸多框架。 &lt;p&gt;MVC将应用程序的用户界面划分为三个方面： &lt;ul&gt;&lt;li&gt;Model:一些描述将要处理的数据的类，并且定义一些数据修改和操作的逻辑规则。&lt;/li&gt;&lt;li&gt;View:定义如何展示应用程序的用户界面（UI）。&lt;/li&gt;&lt;li&gt;Controller: 处理用户交互、应用程序流以及具体的应用逻辑的类。 &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;MVC&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;用作用户界面模式&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;&lt;/em&gt;&lt;/strong&gt; &lt;p&gt;请注意我们引入MVC作为一种用户界面模型。MVC模式展示了一种处理用户交互的解决方案，但是并没有提到应该怎样处理数据访问、服务交互等其他应用程序的关注点。在通往MVC时要记住一点：它是有用的模式，但很可能只是开发应用过程中用到的诸多模式之一。 &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;MVC&lt;/strong&gt;&lt;strong&gt;用作&lt;/strong&gt;&lt;strong&gt;web&lt;/strong&gt;&lt;strong&gt;框架&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt; &lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;MVC模式经常被用在web编程中，关于ASP.NET MVC可以大致这样理解： &lt;ul&gt;&lt;li&gt;&amp;nbsp;&lt;strong&gt;Models&lt;/strong&gt;：这是一些呈现所关注的领域模型的类。这些领域模型通常封装存储在数据库中的数据，以及操作数据和增强领域业务逻辑的代码。对于ASP.NET MVC而言，通过使用Entity Framework和NHibernate工具，结合针对领域模型的业务逻辑的自定义代码，它在某种程度上类似于数据访问层。&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;strong&gt;View&lt;/strong&gt;：一个动态生成HTML的模板。在第3章会更加深入了解view。&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;strong&gt;Controller&lt;/strong&gt;：管理View和Model质检关系的具体类。它响应用户输入，告知Model,并决定要展示的view。在ASP.NET MVC中，该类以Controller为后缀。&lt;a name="_GoBack"&gt;&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;通往&lt;/strong&gt;&lt;strong&gt;MVC3&lt;/strong&gt;&lt;strong&gt;之路&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt; &lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;短短两年之内，已经发布了三个主要的ASP.NET MVC版本以及几个其他过渡版本。为了更好地理解ASP.NET MVC3，了解它的发展历程也是很重要的。本节主要介绍三个ASP.NET MVC版本的内容及背景。 &lt;p&gt;&lt;strong&gt;&lt;em&gt;ASP.NET MVC 1&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;概述&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;&lt;/em&gt;&lt;/strong&gt; &lt;p&gt;2007年2月，微软的Scott Guthrie (&amp;#8220;ScottGu&amp;#8221;)在飞往美国东海岸参加会议的途中构思出了ASP.NET MVC的要点。这是一个简单的应用，只包含几百行的代码，但为一些web开发者听众带来的希望和潜力却是巨大的。 &lt;p&gt;接下来，2007年10月，在华盛顿雷德蒙德举行的奥斯汀ALT.NET会议上，ScottGu想众多开发者展示了&amp;#8220;在飞机上编写的超酷的东西&amp;#8221;，并问他们是否看到了这个需要以及大家的看法。这是比较令人震惊的。事实上，很多人关心这个叫做Scalene的原型。Eilon Lipton 2007年9月将第一个原型发送给了团队，然后他和ScottGu 一起将原型、代码以及想法来回修改了多次。 &lt;p&gt;即便到了官方版本发布之时，很明显ASP.NET MVC仍然不是我们标准的微软产品。它的开发周期包含了很强的交互性：官方版本发布之前发布了九个测试版本，进行单元测试，源代码也是采用公开的序列号。这一切都强调了一个哲理：在开发过程中要注重沟通交流。最终的成果是官方版MVC 1.0发布了，包含代码及单元测试，而且已经被由使用它的开发者们进行了预览和使用。ASP.NET MVC 1.0于2009年3月13日正式发布。 &lt;p&gt;&lt;strong&gt;&lt;em&gt;ASP.NET MVC 2&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;概述&lt;/em&gt;&lt;/strong&gt; &lt;p&gt;仅仅时隔一年之后，2010年三月ASP.NET MVC2发布了。MVC2的主要特点包括： &lt;ul&gt;&lt;li&gt;支持自定义模板的UI helpers.&lt;/li&gt;&lt;li&gt;客户端和服务端基于属性的Model验证&lt;/li&gt;&lt;li&gt;强类型HTML helper&lt;/li&gt;&lt;li&gt;改进Visual Studio 工具 ：基于使用ASP.NET MVC1开发应用的开发者们的反馈，添加了许多API强化和高级特性，例如：&lt;/li&gt;&lt;li&gt;支持将较大的应用进行分割&lt;/li&gt;&lt;li&gt;异步Controllers支持&lt;/li&gt;&lt;li&gt;支持通过使用Html.RenderAction展示一个页面/站点的子段落&lt;/li&gt;&lt;li&gt;许多新的helper方法，实体，以及API强化 &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;MVC2的发布开设了一个先例，即没有太多突破性的改变。我想这是ASP.NET MVC设计模式需要遵循的一个约定，在不改变核心的前提下进行一系列扩展。 &lt;p&gt;&lt;strong&gt;&lt;em&gt;ASP.NET MVC3&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;概述&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;&lt;/em&gt;&lt;/strong&gt; &lt;p&gt;迫于Web Matrix的发布日期，ASP.NET MVC3(以后本书简称MVC3)在MVC2后10个月就发布了。假如MVC 3是装在箱子里的，那么它的前面可能会写着： &lt;ul&gt;&lt;li&gt;包含Razor引擎的View表现层！&lt;/li&gt;&lt;li&gt;.NET 4的数据注释支持！&lt;/li&gt;&lt;li&gt;改进Model验证后的流线型验证！&lt;/li&gt;&lt;li&gt;包含了依赖方案和整体Action过滤的强大地钩子！&lt;/li&gt;&lt;li&gt;丰富的javascript支持，包括不唐突的javascript, jQuery验证以及JSON绑定！&lt;/li&gt;&lt;li&gt;开始NuGet！！！ &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;对于曾经用过之前版本MVC的读者来说，我们将快速浏览一下这几个主要特性来开始我们的MVC之旅。 &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;Razor&lt;/strong&gt;&lt;strong&gt;引擎&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt; &lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Razor是自十年前ASP.NET 1.0发布以来对于HTML展示的一个最主要的更新。在MVC1和2中默认使用的view引擎是Web Forms View引擎，因为它和Web Forms使用相同的ASPX/ASCX/MASTER文件和语法。它可以正常运作，但它的设计是支持在图形编辑器中进行控件编辑的，然后进行显示。下面是一个Web Forms页面语法的例子： &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;&amp;lt;%@ Page Language=&amp;#8221;C#&amp;#8221; MasterPageFile=&amp;#8221;~/Views/Shared/Site.Master&amp;#8221; &lt;p&gt;Inherits=&amp;#8221;System.Web.Mvc.ViewPage&amp;lt;MvcMusicStore.ViewModels.StoreBrowseViewModel&amp;gt;&amp;#8221; &lt;p&gt;%&amp;gt; &lt;p&gt;&amp;lt;asp:Content ID=&amp;#8221;Content1&amp;#8221; ContentPlaceHolderID=&amp;#8221;TitleContent&amp;#8221; runat=&amp;#8221;server&amp;#8221;&amp;gt; &lt;p&gt;Browse Albums &lt;p&gt;&amp;lt;/asp:Content&amp;gt; &lt;p&gt;&amp;lt;asp:Content ID=&amp;#8221;Content2&amp;#8221; ContentPlaceHolderID=&amp;#8221;MainContent&amp;#8221; runat=&amp;#8221;server&amp;#8221;&amp;gt; &lt;p&gt;&amp;lt;div class=&amp;#8221;genre&amp;#8221;&amp;gt; &lt;p&gt;&amp;lt;h3&amp;gt;&amp;lt;em&amp;gt;&amp;lt;%: Model.Genre.Name %&amp;gt;&amp;lt;/em&amp;gt; Albums&amp;lt;/h3&amp;gt; &lt;p&gt;&amp;lt;ul id=&amp;#8221;album-list&amp;#8221;&amp;gt; &lt;p&gt;&amp;lt;% foreach (var album in Model.Albums) { %&amp;gt; &lt;p&gt;&amp;lt;li&amp;gt; &lt;p&gt;&amp;lt;a href=&amp;#8221;&amp;lt;%: Url.Action(&amp;#8220;Details&amp;#8221;, new { id = album.AlbumId }) %&amp;gt;&amp;#8221;&amp;gt; &lt;p&gt;&amp;lt;img alt=&amp;#8221;&amp;lt;%: album.Title %&amp;gt;&amp;#8221; src=&amp;#8221;&amp;lt;%: album.AlbumArtUrl %&amp;gt;&amp;#8221; /&amp;gt; &lt;p&gt;&amp;lt;span&amp;gt;&amp;lt;%: album.Title %&amp;gt;&amp;lt;/span&amp;gt; &lt;p&gt;&amp;lt;/a&amp;gt; &lt;p&gt;&amp;lt;/li&amp;gt; &lt;p&gt;&amp;lt;% } %&amp;gt; &lt;p&gt;&amp;lt;/div&amp;gt; &lt;p&gt;&amp;lt;/asp:Content&amp;gt; &lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Razor是专门设计用来作为view引擎语法的。它有一个主旨： &lt;em&gt;&lt;strong&gt;code-focused templating for HTML generation&lt;/strong&gt;&lt;/em&gt;.下面是如何使用Razor生成相同的标签： &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;@model MvcMusicStore.Models.Genre &lt;p&gt;@{ViewBag.Title = &amp;#8220;Browse Albums&amp;#8221;;} &lt;p&gt;&amp;lt;div class=&amp;#8221;genre&amp;#8221;&amp;gt; &lt;p&gt;&amp;lt;h3&amp;gt;&amp;lt;em&amp;gt;@Model.Name&amp;lt;/em&amp;gt; Albums&amp;lt;/h3&amp;gt; &lt;p&gt;&amp;lt;ul id=&amp;#8221;album-list&amp;#8221;&amp;gt; &lt;p&gt;@foreach (var album in Model.Albums) &lt;p&gt;{ &lt;p&gt;&amp;lt;li&amp;gt; &lt;p&gt;&amp;lt;a href=&amp;#8221;@Url.Action(&amp;#8221;Details&amp;#8221;, new { id = album.AlbumId })&amp;#8221;&amp;gt; &lt;p&gt;&amp;lt;img alt=&amp;#8221;@album.Title&amp;#8221; src=&amp;#8221;@album.AlbumArtUrl&amp;#8221; /&amp;gt; &lt;p&gt;&amp;lt;span&amp;gt;@album.Title&amp;lt;/span&amp;gt; &lt;p&gt;&amp;lt;/a&amp;gt; &lt;p&gt;&amp;lt;/li&amp;gt; &lt;p&gt;} &lt;p&gt;&amp;lt;/ul&amp;gt; &lt;p&gt;&amp;lt;/div&amp;gt; &lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Razor语法容易输入和阅读，它不像Web Forms引擎中包含XML类似的重量级语法。 &lt;p&gt;我们已经谈了用Razor语法进行开发的不同。为了将它推广到更多的地方，我们一起看一下开创Razor语法的团队的设计目标： &lt;ul&gt;&lt;li&gt;&amp;nbsp;&lt;strong&gt;简洁，丰富，流畅&lt;/strong&gt;： Razor对于生成HTML的模板的及其关注，最终造就了极其简约的语法。这不仅减少了键盘输入，当然这是不言而喻的，另外它还能很容易的表达你的意图。一个关键的例子是对于标签和代码之间传递数据时的简化。当你用循环来写一些model属性时会看到实际效果： &lt;/li&gt;&lt;/ul&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;@foreach (var album in Model.Albums) &lt;p&gt;{ &lt;p&gt;&amp;lt;li&amp;gt; &lt;p&gt;&amp;lt;a href=&amp;#8221;@Url.Action(&amp;#8220;Details&amp;#8221;, new { id = album.AlbumId })&amp;#8221;&amp;gt; &lt;p&gt;&amp;lt;img alt=&amp;#8221;@album.Title&amp;#8221; src=&amp;#8221;@album.AlbumArtUrl&amp;#8221; /&amp;gt; &lt;p&gt;&amp;lt;span&amp;gt;@album.Title&amp;lt;/span&amp;gt; &lt;p&gt;&amp;lt;/a&amp;gt; &lt;p&gt;&amp;lt;/li&amp;gt; &lt;p&gt;} &lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;基于母版页的概念进行改进，Razor使用Layouts简化了标签，它具有更高的灵活性和更少的代码。 &lt;ul&gt;&lt;li&gt;&amp;nbsp;&lt;strong&gt;并非一种新生语言&lt;/strong&gt;：Razor是一种让你能够凭直觉在模板中使用.NET编码技术的语法。&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;strong&gt;易于学习&lt;/strong&gt;：正因为Razor不是一种新的语言，所以它是很容易学习的。了解了HTML，了解了.NET；那么就开始键入HTML,然后在需要编写.NET代码的时候输入@符号就可以了。&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;strong&gt;使用任何文本编辑器&lt;/strong&gt;：由于Razor是专注于HTML的轻量级语法，你可以选择任意一种编辑器。Visual Studio的语法高亮和智能感知特性是非常友好的，不过实际上Razor简单到你可以在任何文本编辑器中进行编辑。&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;strong&gt;强大的智能感知&lt;/strong&gt;：尽管Razor设计之初并未要求智能感知，不过当查看model对象支持的属性时，智能感知将会提供极大的便利。在这些情况下，Razor确实在Visual Studio中提供了完善的智能感知，如图1-1. &lt;/li&gt;&lt;/ul&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201203/201203261649083866.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image001" border="0" alt="clip_image001" src="http://images.cnblogs.com/cnblogs_com/janes/201203/201203261649086308.png" width="530" height="247" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;&amp;nbsp;&lt;strong&gt;单元测试&lt;/strong&gt;：Razor引擎的核心编译引擎并不依赖于System.web或ASP.NET等，它可以在单元测试甚至命令行中执行。尽管目前还没有直接支持这些的工具，但可以使用类似于David Ebbo 的Visual Studio单文件生成器(http://visualstudiogal-lery.msdn.microsoft.com/1f6ec6ff-e89b-4c47-8e79-d2d68df894ec/)的系统来将view编译成类，然后像其他项目一样进行加载和测试。 &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;这仅仅是Razor使编写view代码简洁有趣的亮点之一，我们将在第3张中进一步深入讨论。 &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;输入验证改进&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt; &lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;输入验证是构建Web应用过程中非常重要的一环，但是并不有趣。我通常在确信它正常工作的前提下，花费尽可能少的时间来编写验证代码。 &lt;p&gt;MVC2的属性驱动验证系统通过用声明性代码取代反复的强制性编码，从而减少了该过程中的许多麻烦。有许多情况下最好忘掉这种&amp;#8220;主逻辑&amp;#8221;，并且不得不编写更多大量的代码。MVC3扩展了这种验证支持，来应对将可能遇到的大多数情景。要想了解ASP.NET MVC更多关于验证的信息，请查看第6章。 &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;.NET 4&lt;/strong&gt;&lt;strong&gt;数据注释支持&lt;/strong&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;MVC2是基于.NET3.5进行编译的，所以并没有提供对于.NET 4数据注释功能的支持。由于.NET 4的支持，目前MVC3已经添加了一些新的并且非常有用的验证特性。这些例子包括： &lt;ul&gt;&lt;li&gt;MVC 2中的DisplayName特性是不能本地化的，但.NET 4支持的System.ComponentModel.DataAnnootations Display特性是可以的。&lt;/li&gt;&lt;li&gt;ValidateAttribute在.NET 4中得到了增强，可以更好地在验证整个model的上下文时起作用，大大简化了否则可能要引用两个model属性的验证。 &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;改善&lt;/strong&gt;&lt;strong&gt;model&lt;/strong&gt;&lt;strong&gt;验证而进行流线型验证&lt;/strong&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;MVC3对于.NET 4 IValidatableObject借口的支持得到了广大的认同。通过在model类中实现该借口并实现Validate方法，你可以通过任何你能想到的方式扩展model类。代码如下所示： &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;public class VerifiedMessage : IValidatableObject { &lt;p&gt;public string Message { get; set; } &lt;p&gt;public string AgentKey { get; set; } &lt;p&gt;public string Hash { get; set; } &lt;p&gt;public IEnumerable&amp;lt;ValidationResult&amp;gt; Validate( &lt;p&gt;ValidationContext validationContext) { &lt;p&gt;if (SecurityService.ComputeHash(Message, AgentKey) != Hash) &lt;p&gt;yield return new ValidationResult(&amp;#8220;Agent compromised&amp;#8221;); &lt;p&gt;} &lt;p&gt;} &lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;丰富的&lt;/strong&gt;&lt;strong&gt;javascript&lt;/strong&gt;&lt;strong&gt;支持&lt;/strong&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;JavaScript在当代任何web应用中都是十分重要的部分。ASP.NET MVC3添加了一些客户端开发的重要支持，并集成了高质量JavaScript的当前标准。要想了解ASP.NET MVC3中新的Javascript相关特性，请看第8章。 &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;高级特性&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Dependency Resolution&lt;/em&gt;&lt;/strong&gt; &lt;p&gt;ASP.NET MVC3引入了名为dependency resolver的新概念，它极大的简化了应用程序中的依赖注入的使用。它更容易去除应用程序组建的耦合性，并且提高了可配置性和可测试性。 &lt;p&gt;以下情况下已经添加了相应支持： &lt;ul&gt;&lt;li&gt;Controllers(注册并注入controller工厂，注入controller)&lt;/li&gt;&lt;li&gt;Views(注册并注入view引擎，将依赖注入到view页面)&lt;/li&gt;&lt;li&gt;Action 过滤器（定位并注入过滤器）&lt;/li&gt;&lt;li&gt;Model绑定（注册并注入）&lt;/li&gt;&lt;li&gt;Model验证提供（注册并注入）&lt;/li&gt;&lt;li&gt;Model元数据提供（注册并注入）&lt;/li&gt;&lt;li&gt;值提供（注册并注入）&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;这是一个足够大的话题，所以我们用一整章（第11章）来讨论。 &lt;p&gt;&lt;strong&gt;&lt;em&gt;Global Action Filters&lt;/em&gt;&lt;/strong&gt; &lt;p&gt;MVC2 action filters提供一个钩子，在执行某个action之前或者之后执行一些代码。它是通过将自定义特性应用于controller action或者全局controller来实现的。MVC2中包含了一些过滤器，就像 Authorize特性等。 &lt;p&gt;MVC 3使用全局action过滤器进行了扩展，他可以应用于真个应用程序中的所有action方法。这对于应用程序的基础关注点是非常有用的，例如如handling和日志等。 &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;MVC3&lt;/strong&gt;&lt;strong&gt;特性总结：各种易用性&lt;/strong&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这是一些伟大的特性，但是如果让我来设计这个箱子，我会在上面写着： &lt;ul&gt;&lt;li&gt;如果你已经推迟了学习ASP.NET MVC,那么它是如此简单，没有任何理由再延迟了。&lt;/li&gt;&lt;li&gt;如果你已经学习ASP.NET MVC一段时间了，那么MVC3能让你的许多复杂的代码变得不在必要。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp; &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;font size="2"&gt;&lt;/font&gt;&amp;nbsp; &lt;p&gt;&lt;font size="2"&gt;注：参考书籍《Professional ASP.NET MVC3》，仅供学习和交流，请勿用于商业用途。&lt;/font&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/janes/aggbug/2418123.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/janes/archive/2012/03/26/2418123.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/janes/archive/2012/02/06/2340112.html</id><title type="text">跟小静读CLR via C#(18)——Enum</title><summary type="text">1. Enum定义 枚举类型是经常用的一种“名称/值”的形式，例如： public enum FeedbackStatus { New, Processing, Verify, Closed }定义枚举类型之后我们在使用时方便了许多，不用再记着0代表什么状态，1代表什么状态。而且枚举类型时强类型的，在编译时就可以进行类型安全检查。枚举类型是值类型的，它是直接从System.Enum继承的，System.Enum又是继承自System.ValueType。但是枚举类型不可以定义方法、属性或者事件。 2. 常用方法 ①Enum.GetUnderlyingType：获取枚举类型实例值的基类。 Co.</summary><published>2012-02-06T06:39:00Z</published><updated>2012-02-06T06:39:00Z</updated><author><name>丫头小静（Cathy）</name><uri>http://www.cnblogs.com/janes/</uri></author><link rel="alternate" href="http://www.cnblogs.com/janes/archive/2012/02/06/2340112.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/janes/archive/2012/02/06/2340112.html"/><content type="html">&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;1. Enum定义 &lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;枚举类型是经常用的一种&amp;#8220;名称/值&amp;#8221;的形式，例如： &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;public &lt;strong&gt;enum&lt;/strong&gt; FeedbackStatus&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; New,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Processing,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Verify,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Closed&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;定义枚举类型之后我们在使用时方便了许多，不用再记着0代表什么状态，1代表什么状态。而且枚举类型时强类型的，在编译时就可以进行类型安全检查。枚举类型是值类型的，它是直接从System.Enum继承的，System.Enum又是继承自System.ValueType。但是枚举类型不可以定义方法、属性或者事件。 &lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;2. 常用方法 &lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;#9312;Enum.&lt;strong&gt;GetUnderlyingType&lt;/strong&gt;：获取枚举类型实例值的基类。 &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; Console.WriteLine(Enum.GetUnderlyingType(typeof(FeedbackStatus)));//结果System.Int32&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;#9313;&lt;strong&gt;ToString&lt;/strong&gt;() ：转换为字符串形式 &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FeedbackStatus status=FeedbackStatus .New ;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(status.ToString());&amp;nbsp;&amp;nbsp;&amp;nbsp; //结果New&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(status.ToString("&lt;strong&gt;G&lt;/strong&gt;")); //结果New&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(status.ToString("&lt;strong&gt;D&lt;/strong&gt;")); //结果0&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;#9314;&lt;strong&gt;GetValues&lt;/strong&gt;：获取枚举类型中定义的所有符号以及对应的值。&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;FeedbackStatus[] status = (FeedbackStatus[])Enum.GetValues(typeof(FeedbackStatus));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach(FeedbackStatus s in status )&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("{0:D}--{0:G}", s);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201202/201202091327522061.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/janes/201202/201202091327535997.png" width="134" height="89" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;#9315;&lt;strong&gt;GetNames&lt;/strong&gt;：获取枚举类型中定义的所有符号。&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;string[] arr= Enum.GetNames(typeof(FeedbackStatus));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (string name in arr)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(name);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201202/201202091327531014.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/janes/201202/20120209132756821.png" width="106" height="82" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;#9316;&lt;strong&gt;Parse, TryParse&lt;/strong&gt;：将文本类型转换为对应的枚举类型。&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;FeedbackStatus status = (FeedbackStatus)Enum.Parse(typeof(FeedbackStatus), "New", false);&lt;br /&gt;Enum.TryParse("aaa", false, out status);&lt;br /&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;#9317;&lt;strong&gt;IsDefine&lt;/strong&gt;：判断一个值对于一个枚举类型是否合法。&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;Console .WriteLine(Enum.IsDefined(typeof(FeedbackStatus),1));&amp;nbsp;&amp;nbsp;&amp;nbsp; //true&lt;br /&gt;Console.WriteLine(Enum.IsDefined(typeof(FeedbackStatus), "New"));//true&lt;br /&gt;Console.WriteLine(Enum.IsDefined(typeof(FeedbackStatus), "new"));//false,区分大小写&lt;br /&gt;Console.WriteLine(Enum.IsDefined(typeof(FeedbackStatus), "aaa"));//false&lt;br /&gt;Console .WriteLine(Enum.IsDefined(typeof(FeedbackStatus ),5));&amp;nbsp;&amp;nbsp; //false&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;3. 扩展方法与枚举&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;上面提到过枚举中是不允许定义方法和事件的。但是我们可以通过扩展方法变相的为枚举添加方法。 &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;public&amp;nbsp; &lt;strong&gt;static class&lt;/strong&gt; EnumMethod&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static void Show(&lt;strong&gt;this FeedbackStatus status&lt;/strong&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string[] arr = Enum.GetNames(typeof(FeedbackStatus));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("枚举类型列表：");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (string name in arr)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(name);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;static void Main(string[] args)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FeedbackStatus status = FeedbackStatus.Processing;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;status.Show();&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201202/201202091327563885.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/janes/201202/201202091327571410.png" width="145" height="100" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;你也许喜欢：&lt;span style="color: #cc334b; font-size: 12px"&gt;&lt;a id="ctl02_TitleUrl" class="postTitle2" href="http://www.cnblogs.com/janes/archive/2011/08/02/2089127.html"&gt;&lt;span style="color: #cc334b" color="#ff3366"&gt;&lt;font color="#ff0080" size="2"&gt;跟小静读CLR via C#（00）-开篇及目录&lt;/font&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/janes/aggbug/2340112.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/janes/archive/2012/02/06/2340112.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/janes/archive/2012/02/06/2339767.html</id><title type="text">跟小静读CLR via C#（17）--接口</title><summary type="text">CLR不允许继承多个基类，但是可以继承多个接口。凡是能使用具名接口类型的实例的地方，都能使用实现了接口的一个类型的实例。 接口是对一组方法签名进行了统一命名，但不提供任何实现，而具体类则必须为继承的全部接口提供实现。 1. 定义接口 接口是用interface关键字定义对一组方法签名，接口名称一般以字母I开头；而且还可以为接口定义事件、索引器和属性，但禁止定义构造器和实例字段，也不能构造任何静...</summary><published>2012-02-06T03:46:00Z</published><updated>2012-02-06T03:46:00Z</updated><author><name>丫头小静（Cathy）</name><uri>http://www.cnblogs.com/janes/</uri></author><link rel="alternate" href="http://www.cnblogs.com/janes/archive/2012/02/06/2339767.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/janes/archive/2012/02/06/2339767.html"/><content type="html">&lt;p&gt;CLR不允许继承多个基类，但是可以继承多个接口。凡是能使用具名接口类型的实例的地方，都能使用实现了接口的一个类型的实例。 接口是对一组方法签名进行了统一命名，但不提供任何实现，而具体类则必须为继承的全部接口提供实现。 &lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;1. 定义接口 &lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;接口是用&lt;strong&gt;interface&lt;/strong&gt;关键字定义对一组方法签名，接口名称一般以字母I开头；而且还可以为接口定义事件、索引器和属性，但禁止定义构造器和实例字段，也不能构造任何静态成员。例如：  &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt; &lt;p&gt;public interface IShout&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public IShout();//×Error Interfaces cannot contain constructors &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; static void Shout1();//×Error The modifier 'static' is not valid for this item &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; void Shout();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string Name { get; set; }&lt;br&gt;} &lt;br&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;2. 接口方法 &lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;具体的类继承接口后要为接口中定义的方法提供实现。我们首先定义一个接口，然后再定义类来实现该接口。  &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt; &lt;p&gt;public interface IIntroduce&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; void Shout();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; void Description();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;接口方法，即具体类中实现接口中定义的方法，它的实现要注意几点：  &lt;ul&gt; &lt;li&gt;接口方法必须是Public； &lt;li&gt;CLR要求将接口方法标记为virtual，否则编译器会自动标记为virtual和sealed。 &lt;/li&gt;&lt;/ul&gt; &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt; &lt;p&gt;public class Animal : IIntroduce&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void Shout()&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //接口方法为标记为virtual &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("Animal Shout.");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public virtual void Description()&amp;nbsp; //接口方法标记为virtual &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("Animal Description.");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;查看IL代码：  &lt;p&gt;&amp;nbsp;&amp;nbsp; &lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201202/201202091329291500.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image004" border="0" alt="clip_image004" src="http://images.cnblogs.com/cnblogs_com/janes/201202/201202091329299024.jpg" width="385" height="45"&gt;&lt;/a&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201202/201202091329307106.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image006" border="0" hspace="12" alt="clip_image006" src="http://images.cnblogs.com/cnblogs_com/janes/201202/201202091329309091.jpg" width="395" height="50"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&amp;nbsp; &lt;ul&gt; &lt;li&gt;派生类可以使用New关键字为接口提供自己的实现。 &lt;/li&gt;&lt;/ul&gt; &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt; &lt;p&gt;public class Dog : Animal&lt;br&gt;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override void Description()//重写基类的接口方法 &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("Dog Description!");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp; public class Cat : Animal, IIntroduce&lt;br&gt;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override void Description()//重写基类的接口方法 &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("Cat Description!");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new public void Shout()//重新实现接口方法 &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("Cat Shout.");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201202/20120209132930203.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image008" border="0" alt="clip_image008" src="http://images.cnblogs.com/cnblogs_com/janes/201202/201202091329306648.jpg" width="194" height="122"&gt;&lt;/a&gt; &lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;3. 显式接口实现 &lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;实现接口有隐式实现和显式实现两种方式。当多个接口中包含名称和签名都相同的方法时，要使用显示接口方法实现。  &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp; public interface IDemo1&lt;br&gt;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; void Func();&lt;br&gt;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp; public interface IDemo2&lt;br&gt;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; void Func();&lt;br&gt;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp; public class Demo : IDemo1, IDemo2&lt;br&gt;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void Func()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("Demo.Func()");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; void IDemo1.Func()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("IDemo1.Func()");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; void IDemo2.Func()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("IDemo2.Func()");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;class Program&lt;br&gt;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; static void Main(string[] args)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Demo demo = new Demo();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; demo.Func();//调用Demo类中的公共方法Func()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ((IDemo1)demo).Func(); //显式调用IDemo1中的Func()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ((IDemo2)demo).Func(); //显式调用IDemo2中的Func()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.Read();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp; }&lt;br&gt; &lt;p&gt;调用结果：&lt;br&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201202/201202091329316125.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image010" border="0" alt="clip_image010" src="http://images.cnblogs.com/cnblogs_com/janes/201202/201202091329319746.jpg" width="144" height="62"&gt;&lt;/a&gt; &lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;显式接口实现要注意：  &lt;ul&gt; &lt;li&gt;不允许指定访问性，如Public等；查看元数据时会发现它自动标记为Private。 &lt;li&gt;不能标记为virtual。 &lt;li&gt;显式接口应该慎重使用，因为值类型的实例在转型为接口时会发生装箱，而且显式接口方法不能被派生类继承。 &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;4.泛型接口&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;FCL提供了很多现成的接口如IComparable，同时提供了其泛型接口形式IComparable&amp;lt;T&amp;gt;.这样做能够编译时就检测类型从而提高了类型安全，而且减少了参数向object类型转换的装箱拆箱操作，提高了性能。  &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt; &lt;p&gt;int x = 1;&lt;/p&gt; &lt;p&gt;IComparable y = "2"; &lt;/p&gt; &lt;p&gt;y.CompareTo(x); //编译通过，运行时错误&lt;br&gt;IComparable&amp;lt;int&amp;gt; z = 3;&lt;br&gt;z.CompareTo(x); //编译通过，运行通过&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;5. 基类vs接口 &lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;如果存在IS-A关系使用基类，存在CAN-DO关系，使用接口。 &lt;li&gt;基类实现较容易一些，基类提供的功能派生类一般稍作改动即可；而接口方法则要实现所有成员。 &lt;li&gt;版本控制：向基类添加新方法后派生类可以直接使用；向接口添加新方法后需要修改源代码并重新编译。 &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;你也许喜欢：&lt;span style="color: #cc334b; font-size: 12px"&gt;&lt;a id="ctl02_TitleUrl" class="postTitle2" href="http://www.cnblogs.com/janes/archive/2011/08/02/2089127.html"&gt;&lt;span style="color: #cc334b" color="#ff3366"&gt;&lt;font color="#ff0080" size="2"&gt;跟小静读CLR via C#（00）-开篇及目录&lt;/font&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/janes/aggbug/2339767.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/janes/archive/2012/02/06/2339767.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/janes/archive/2012/01/30/2331370.html</id><title type="text">高性能网站14条&amp;mdash;&amp;mdash;读《高性能网站建设指南》</title><summary type="text">虽然不是做前端开发的，但是了解一些也是有用的。例如js脚本和css脚本是应该放在页面顶部吗？… 规则1、 较少HTTP请求 性能黄金法则：只有10%-20%的最终用户响应时间花在了下载HTML文档上。其余的80%-90%时间花在了下载页面的所有组件上。 实现技术： 图片地图（Image map）：当在导航栏或者其他超链接中使用多个图片时，使用图片地图在一个图片上关联多个URL，可以减...</summary><published>2012-01-30T08:35:00Z</published><updated>2012-01-30T08:35:00Z</updated><author><name>丫头小静（Cathy）</name><uri>http://www.cnblogs.com/janes/</uri></author><link rel="alternate" href="http://www.cnblogs.com/janes/archive/2012/01/30/2331370.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/janes/archive/2012/01/30/2331370.html"/><content type="html">&lt;p&gt;&lt;strong&gt;虽然不是做前端开发的，但是了解一些也是有用的。例如js脚本和css脚本是应该放在页面顶部吗？… &lt;/strong&gt;&lt;/p&gt; &lt;hr&gt;  &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;规则1&lt;/strong&gt;&lt;strong&gt;、 &lt;/strong&gt;&lt;strong&gt;较少HTTP&lt;/strong&gt;&lt;strong&gt;请求&lt;/strong&gt; &lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;性能黄金法则&lt;/strong&gt;：只有10%-20%的最终用户响应时间花在了下载HTML文档上。其余的80%-90%时间花在了下载页面的所有组件上。  &lt;p&gt;实现技术：  &lt;ul&gt; &lt;li&gt;图片地图（Image map）：当在导航栏或者其他超链接中使用多个图片时，使用图片地图在一个图片上关联多个URL，可以减少HTTP请求加速页面。 &lt;li&gt;CSS Sprites：将多个图片合并到一个单独的图片中，然后使用CSS的background-positon属性为span,div等设置背景图片。通过合并图片减少了HTTP请求，并且比&amp;nbsp; 图片地图更加灵活。 &lt;li&gt;合并脚本和样式表：如果页面引用了多个样式表和脚本那就需要合并了，最好一个页面不多于一个脚本和样式表。 &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;规则2&lt;/strong&gt;&lt;strong&gt;、 &lt;/strong&gt;&lt;strong&gt;使用内容发布网络CDN&lt;/strong&gt; &lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;CDN是一组分布在多个不同地理位置的web服务器，可以更加有效的向用户发布内容。  &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;规则3&lt;/strong&gt;&lt;strong&gt;、添加Expires&lt;/strong&gt;&lt;strong&gt;头&lt;/strong&gt; &lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;我们利用浏览器的缓存来改善网站性能，Web服务器使用Expires头来告诉web客户端它可以使用一个组件的当前副本，直到指定的时间为止，例如。&amp;nbsp;&amp;nbsp; &lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201201/201201291816159312.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://images.cnblogs.com/cnblogs_com/janes/201201/201201291816158788.jpg" width="244" height="21"&gt;&lt;/a&gt;  &lt;p&gt;两外还可以用Cache-Control的max-age来指定组件缓存的秒数。例如：  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201201/201201291816155757.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image004" border="0" alt="clip_image004" src="http://images.cnblogs.com/cnblogs_com/janes/201201/201201291816154361.jpg" width="244" height="28"&gt;&lt;/a&gt;  &lt;p&gt;文件名：添加缓存后，那么相应的组件更新时用户也获取不到新版本，为了解决这个问题可以在文件名中添加版本号。  &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;规则4&lt;/strong&gt;&lt;strong&gt;：压缩组件&lt;/strong&gt; &lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;通常的做法是用gzip压缩脚本和样式表。  &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;规则5&lt;/strong&gt;&lt;strong&gt;：将样式表放在顶部&lt;/strong&gt; &lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;为了避免白屏现象，请使用LINK标签将样式表放在文档顶部的head中，这样无论页面是在新窗口打开、重新加载还是作为主页，页面都是逐步呈现的。  &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;规则6&lt;/strong&gt;&lt;strong&gt;：将脚本放在底部&lt;/strong&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;HTTP1.1规范检疫浏览器从每个主机名并行下载两个组件，这样可以提高性能。但为了保证脚本正确的执行顺序，下载脚本时&lt;/p&gt; &lt;p&gt;不是并行的。因此脚本对web页面会有以下影响：  &lt;ul&gt; &lt;li&gt;脚本会阻塞对其后面内容的呈现； &lt;li&gt;脚本会阻塞对其后面组件的下载。&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;将脚本移到页面底部可以加速web页面。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;规则7：避免是用CSS表达式&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;CSS表达式允许动态设置CSS属性，例如&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201201/20120130112627608.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/janes/201201/201201301126287609.png" width="556" height="29"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;问题是表达式求值的频率过高，除了页面加载和改变大小外，当页面滚动、鼠标移动时都会重新求值。&lt;/p&gt; &lt;p&gt;解决方式：&lt;/p&gt; &lt;ul&gt; &lt;li&gt;一次性表达式：可以将上面例子中计算背景色的部分提取到js中，然后在css中调用一次该方法。 &lt;li&gt;事件处理器：可以将需要计算的部分提取到单独的方法中，并写明调用该方法的事件，例如window.resize等等，这样就能减少不必要的求值。&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;规则8：使用外部Javascript和css&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;如果纯粹比较javascript和css的内联外联的话，可能内联会快一些。但在实际应用时，由于外联文件可以被浏览器缓存起来，因此使用外部文件会产生较快的页面。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;规则9：减少DNS查找&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#000000"&gt;&lt;font style="font-weight: normal"&gt;DNS将主机名映射到IP地址上，当用户请求一个主机名之后，DNS信息会留在操作系统的DNS缓存中来提高性能。通过使用Keep-Alive和较少的域名来减少DNS查找。&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;规则10：精简Javascript&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;精简是从代码中移除不必要的字符以减小其大小，进而改善加载时间。常用的javascript精简工具有JSMin,DojoCompressor等。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;规则11：避免重定向&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;重定向用于将用户从一个URL重新路由到另一个URL，实现重定向可能有很多原因，包括网站重新设计、跟踪流量、记录广告点击、建立便于记忆的URL等。但实际上重定向会使页面变慢，下面是几种常见的替代方案：&lt;/p&gt; &lt;ul&gt; &lt;li&gt;URL结尾斜线：如果网站包含目录并且使用了自动索引，那么当URL结尾缺少应有的斜线时，可能会发送重定向。 &lt;li&gt;跟踪内部流量：重定向经常用于跟踪用户流量的流向。也可以用Referer日志来跟踪流量，避免给向用户发送重定向，从而改善响应时间。 &lt;li&gt;美化URL：为了向user展现便于记忆的URL，有时需要重定向。其实可以利用Alias,mod_rewrite和直接链接代码等来避免。&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;规则12：移除重复脚本&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;由于团队大小和脚本数量的影响，网站中的脚本是可能重复的，这可能导致不必要的HTTP请求和执行Javascript时浪费时间。要避免重复使用脚本，可以在模板系统中实现脚本管理模块，处理脚本的依赖性和版本。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;规则13：配置或移除ETag&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;ETag(Entity Tag)实体标签，是Web服务器和浏览器用于确认缓存组件的有效性机制之一。它是唯一标识了一个组件的特定版本的字符串，格式约束是该字符串要用引号引起来。例如：&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201202/201202091331389074.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/janes/201202/201202091331381058.png" width="389" height="131"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;如果网站时放在同一台服务器是没有问题的，但是如果使用了服务器集群，则组件的下载次数会增多，导致性能下降。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;规则14：使用Ajax可缓存&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;确保Ajax请求遵守性能指导，尤其应具有长久的Expires头。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/janes/aggbug/2331370.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/janes/archive/2012/01/30/2331370.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/janes/archive/2012/01/01/2309332.html</id><title type="text">IIS 7的备份与恢复</title><summary type="text">在%systemdrive%\windows\system32\inetsrv\下应该有个工具--Appcmd.exe，我们将使用该工具进行IIS7的备份及恢复。 备份 &gt;AppCmd Add Backup "BackupName" 罗列备份 &gt;AppCmd List Backup 恢复 &gt;AppCmd Restore Backup "BackupName" 然后将%systemdrive%\windows\system32\inetsrv\backup里面你的备份文件夹拷贝出来，以后就可以恢复了</summary><published>2012-01-01T03:07:00Z</published><updated>2012-01-01T03:07:00Z</updated><author><name>丫头小静（Cathy）</name><uri>http://www.cnblogs.com/janes/</uri></author><link rel="alternate" href="http://www.cnblogs.com/janes/archive/2012/01/01/2309332.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/janes/archive/2012/01/01/2309332.html"/><content type="html">&lt;p&gt;&lt;br&gt;在%systemdrive%\windows\system32\inetsrv\下应该有个工具--Appcmd.exe，我们将使用该工具进行IIS7的备份及恢复。&lt;br&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;备份&lt;br&gt;&lt;/font&gt;&lt;/strong&gt;&amp;gt;AppCmd Add Backup "BackupName"&lt;br&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;罗列备份&lt;br&gt;&lt;/font&gt;&lt;/strong&gt;&amp;gt;AppCmd List Backup&lt;br&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;恢复&lt;br&gt;&lt;/font&gt;&lt;/strong&gt;&amp;gt;AppCmd Restore Backup "BackupName"&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;然后将%systemdrive%\windows\system32\inetsrv\backup里面你的备份文件夹拷贝出来，以后就可以恢复了&lt;/p&gt; &lt;img src="http://www.cnblogs.com/janes/aggbug/2309332.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/janes/archive/2012/01/01/2309332.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/janes/archive/2011/12/21/2295959.html</id><title type="text">跟小静读CLR via C#(16)--泛型</title><summary type="text">泛型就像是一个模板，常常定义一些通用的算法，具体调用时再替换成实际的数据类型，提高了代码的可重用性。 一、初识泛型1. 简单实例以最常用的FCL中的泛型List&lt;T &gt;为例： static void Main(string[] args) { List&lt;int&gt; num = new List&lt;int&gt;(); num.Add(1); num.Add(3); int num1 = num[0]; int num2 = num[1]; }尖括号中的T是不确定的数据类型，叫做类型参数，一般规定以字母T开头，可以是TKey, TValue都可以。而调用时指定的具体类型</summary><published>2011-12-21T08:48:00Z</published><updated>2011-12-21T08:48:00Z</updated><author><name>丫头小静（Cathy）</name><uri>http://www.cnblogs.com/janes/</uri></author><link rel="alternate" href="http://www.cnblogs.com/janes/archive/2011/12/21/2295959.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/janes/archive/2011/12/21/2295959.html"/><content type="html">&lt;p&gt;&lt;font size="2"&gt;泛型就像是一个模板，常常定义一些通用的算法，具体调用时再替换成实际的数据类型，提高了代码的可重用性。 &lt;/font&gt;&lt;/p&gt;&lt;font size="2"&gt;&lt;hr /&gt;&lt;/font&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000" size="2"&gt;一、初识泛型&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1. 简单实例&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="2"&gt;以最常用的FCL中的泛型List&amp;lt;T &amp;gt;为例： &lt;/font&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;&lt;font size="2"&gt;static void Main(string[] args)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;int&amp;gt; num = new List&amp;lt;int&amp;gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; num.Add(1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; num.Add(3);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int num1 = num[0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int num2 = num[1];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201112/20111221160045144.png"&gt;&lt;font size="2"&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201112/201112211609537819.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/janes/201112/201112211609547852.png" width="443" height="167" /&gt;&lt;/a&gt;&lt;/font&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;font size="2"&gt;尖括号中的T是不确定的数据类型，叫做&lt;font style="background-color: #ffff00"&gt;类型参数&lt;/font&gt;，一般规定以字母T开头，可以是TKey, TValue都可以。而调用时指定的具体类型叫做&lt;font style="background-color: #ffff00"&gt;类型实参&lt;/font&gt;。 &lt;/font&gt;&lt;p&gt;&lt;font size="2"&gt;查看一下IL代码： &lt;/font&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201112/20111221160046243.png"&gt;&lt;font size="2"&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201112/201112211609547362.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/janes/201112/201112211609552968.png" width="558" height="372" /&gt;&lt;/a&gt;&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;ul&gt;&lt;li&gt;&lt;font size="2"&gt;类型名List是以&amp;#8220;`&amp;#8221;加数字结尾的。数字表示类型的&lt;font style="background-color: #ffff00"&gt;元数&lt;/font&gt;，也就是需要指定具体类型的参数个数。 &lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font size="2"&gt;泛型是类型安全的。如果用&amp;#8220;num.Add("a");&amp;#8221;会发生编译错误； &lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font size="2"&gt;泛型可以提高算法的可重用性，而且从例子中看出int类型并没有进行装箱拆箱操作，相比将所有类型转换为Object的方式而言，提高了程序的性能。&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font size="2"&gt;为泛型变量设置默认值时常使用&lt;strong&gt;default&lt;/strong&gt;关键字进行，T temp=default(T)。如果T为引用类型，则temp为null;如果T为值类型，则temp设为0值.&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;2. 开放类型与封闭类型：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="2"&gt;&lt;font style="background-color: #ffff00"&gt;开放类型&lt;/font&gt;：具有泛型参数的类型是开放类型，如List&amp;lt;T&amp;gt;，CLR不允许构造开放类型的实例； &lt;/font&gt;&lt;p&gt;&lt;font size="2"&gt;&lt;font style="background-color: #ffff00"&gt;封闭类型&lt;/font&gt;：在实际调用代码时，如果所有类型实参都已经指定了实际数据类型，如List&amp;lt;string&amp;gt;，则该类型为封闭类型。CLR允许构造封闭类型的实例。 &lt;/font&gt;&lt;p&gt;&lt;strong&gt;3. 类型推断：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="2"&gt;先看这段很常见的代码： &lt;/font&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201112/201112211600484062.png"&gt;&lt;font size="2"&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201112/201112211610275813.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/janes/201112/201112211610272814.png" width="468" height="369" /&gt;&lt;/a&gt;&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;p&gt;&lt;font size="2"&gt;为了增强可读性，编译器支持类型推断功能，省略&amp;lt;&amp;gt;，我们可以将上面调用的方法改为： &lt;/font&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201112/201112211601203908.png"&gt;&lt;font size="2"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/janes/201112/201112211601249255.png" width="272" height="121" /&gt;&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;p&gt;&lt;font size="2"&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;*&lt;/strong&gt;&lt;/font&gt; 需要注意的是，类型推断时C#使用的是变量的数据类型，而不是变量引用的对象的类型。例如： &lt;/font&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201112/201112211601368383.png"&gt;&lt;font size="2"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/janes/201112/201112211601363956.png" width="240" height="97" /&gt;&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;p&gt;&lt;font size="2"&gt;虽然s1和s2都是指向了字符串对象，但是这两个变量的类型是不同的，所以会产生编译错误。&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000" size="2"&gt;二、协变和逆变泛型类型参数&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="2"&gt;通过协变量和逆变量，可以将泛型委托或者接口的类型参数进行一定的类型转换。 &lt;/font&gt;&lt;ul&gt;&lt;li&gt;&lt;font size="2"&gt;&lt;font style="background-color: #ffff00"&gt;逆变量&lt;/font&gt;：泛型类型参数可以从基类转为派生类，用in关键字标识，只出现在输入位置，例如方法的参数；&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;&lt;font size="2"&gt;public delegate void Func&amp;lt;in T&amp;gt;(T arg); &lt;/font&gt;&lt;p&gt;&lt;font size="2"&gt;static void Main(string[] args) &lt;/font&gt;&lt;p&gt;&lt;font size="2"&gt;{ &lt;/font&gt;&lt;p&gt;&lt;font size="2"&gt;Func&amp;lt;object&amp;gt; f1 = null; &lt;/font&gt;&lt;p&gt;&lt;font size="2"&gt;Func&amp;lt;string&amp;gt; f2 = f1; &lt;/font&gt;&lt;p&gt;&lt;font size="2"&gt;} &lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;&lt;font size="2"&gt;&lt;font style="background-color: #ffff00"&gt;协变量&lt;/font&gt;：泛型类型参数可以从派生类改为它的基类，用out关键字标识，只出现在输出位置，例如方法的返回值。&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;&lt;font size="2"&gt;public delegate TResult Func&amp;lt;out TResult&amp;gt;(); &lt;/font&gt;&lt;p&gt;&lt;font size="2"&gt;static void Main(string[] args) &lt;/font&gt;&lt;p&gt;&lt;font size="2"&gt;{ &lt;/font&gt;&lt;p&gt;&lt;font size="2"&gt;Func&amp;lt;string&amp;gt; fn=null; &lt;/font&gt;&lt;p&gt;&lt;font size="2"&gt;object result=fn(); &lt;/font&gt;&lt;p&gt;&lt;font size="2"&gt;}&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000" size="2"&gt;三、泛型约束&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="2"&gt;在设计泛型的类型参数时，可以通过where子句指定类型需要满足的约束条件。主要包含以下几种约束方式： &lt;/font&gt;&lt;p&gt;&lt;strong&gt;1. 主要约束&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="2"&gt;一个类型参数可以指定0或1个主要约束，主要约束可以一个非密封的引用类型，它表示类型实参必须与约束类型相同或者为约束类型的派生类。该引用类型不能为Object, Array, Delegate, MulticastDelegate, ValueType, Enum, Void。 &lt;/font&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;&lt;font size="2"&gt;class Constraint1&amp;lt;T&amp;gt; where T : Stream&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void Close(T stream)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; stream.Close();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="2"&gt;class Program&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; static void Main(string[] args)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Constraint1&amp;lt;FileStream&amp;gt; s2 = new Constraint1&amp;lt;FileStream&amp;gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;font size="2"&gt;两种特殊的主要约束：&lt;font color="#ff0000"&gt;class&lt;/font&gt;和&lt;font color="#ff0000"&gt;struct&lt;/font&gt;。 &lt;/font&gt;&lt;ul&gt;&lt;li&gt;&lt;font size="2"&gt;&lt;font style="background-color: #ffff00"&gt;Class约束&lt;/font&gt;：要求指定的类型实参必须是引用类型。Where T:class &lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201112/201112211601375626.png"&gt;&lt;font size="2"&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201112/20111221161036358.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/janes/201112/201112211610367916.png" width="501" height="221" /&gt;&lt;/a&gt;&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="2"&gt;在没有约束的情况下，如果T为值类型，是不能赋值为null的，所以会产生编译错误。添加约束后编译通过:&lt;/font&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201112/201112211601383216.png"&gt;&lt;font size="2"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/janes/201112/201112211601389138.png" width="303" height="111" /&gt;&lt;/font&gt;&lt;/a&gt; &lt;ul&gt;&lt;li&gt;&lt;font size="2"&gt;&lt;font style="background-color: #ffff00"&gt;Struct 约束&lt;/font&gt;：要求指定的类型实参必须是值类型&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201112/20111221160148161.png"&gt;&lt;font size="2"&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201112/201112211610402216.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/janes/201112/201112211610414333.png" width="459" height="240" /&gt;&lt;/a&gt;&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="2"&gt;在没有约束的情况下，如果T为引用类型是不能声明为可空值类型的，所以会产生编译错误。添加struct约束后运行正常: &lt;/font&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201112/201112211601491340.png"&gt;&lt;font size="2"&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201112/201112211610429906.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/janes/201112/201112211610421891.png" width="318" height="124" /&gt;&lt;/a&gt;&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;p&gt;&lt;strong&gt;2. 次要约束&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="2"&gt;一个类型参数可以指定0或者多个次要约束。常见的次要约束主要有两种： &lt;/font&gt;&lt;ul&gt;&lt;li&gt;&lt;font size="2"&gt;接口约束：类型实参必须实现了指定的所有接口。例如：&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201112/201112211601498342.png"&gt;&lt;font size="2"&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201112/201112211610438053.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/janes/201112/20111221161051373.png" width="505" height="143" /&gt;&lt;/a&gt;&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;font size="2"&gt;接口约束的另外一个好处是：值类型实参调用接口方法时不用进行装箱操作。 &lt;/font&gt;&lt;ul&gt;&lt;li&gt;&lt;font size="2"&gt;类型参数约束：在指定的类型实参之间，存在着一定关系。例如要求存在继承关系： &lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201112/201112211601501996.png"&gt;&lt;font size="2"&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201112/201112211610528454.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/janes/201112/201112211610527125.png" width="464" height="298" /&gt;&lt;/a&gt;&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;3. 构造器约束&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="2"&gt;构造器约束要求类型实参必须实现了无参构造器，而且它不支持有参构造器。 &lt;/font&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201112/201112211601519935.png"&gt;&lt;font size="2"&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201112/201112211610539982.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/janes/201112/201112211610531651.png" width="430" height="379" /&gt;&lt;/a&gt;&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;font size="2"&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;你也许喜欢：&lt;span style="color: #cc334b; font-size: 12px"&gt;&lt;a id="ctl02_TitleUrl" class="postTitle2" href="http://www.cnblogs.com/janes/archive/2011/08/02/2089127.html"&gt;&lt;span style="color: #cc334b" color="#ff3366"&gt;&lt;font color="#ff0080" size="2"&gt;跟小静读CLR via C#（00）-开篇及目录&lt;/font&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/font&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/janes/aggbug/2295959.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/janes/archive/2011/12/21/2295959.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/janes/archive/2011/12/09/2281949.html</id><title type="text">从零开始MVC3—Music Store实例&amp;amp;Controller</title><summary type="text">1. 引言 MVC主要包括Model,View和Controller三部分，首先简单学习一下Controller，以MusicStore为实例，先有一个初步印象。 2. Music Store简介 MusicStore是一个非常好的学习实例，而且提供了非常详细的操作步骤。下载地址：http://mvcmusicstore.codeplex.com/ 它是一个简单的音乐商店，主要包含三个功能模块：购物，结算和后台管理。 首先打开完整版，看一下运行效果： 3. 创建Music Store项目 然后从头开始，一步步搭建我们的音乐商店。 新建项目，选项设置如下图所示： l Pro...</summary><published>2011-12-09T06:07:00Z</published><updated>2011-12-09T06:07:00Z</updated><author><name>丫头小静（Cathy）</name><uri>http://www.cnblogs.com/janes/</uri></author><link rel="alternate" href="http://www.cnblogs.com/janes/archive/2011/12/09/2281949.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/janes/archive/2011/12/09/2281949.html"/><content type="html">&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;1. 引言&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;MVC主要包括Model,View和Controller三部分，首先简单学习一下Controller，以MusicStore为实例，先有一个初步印象。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;2. Music Store简介&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;MusicStore是一个非常好的学习实例，而且提供了非常详细的操作步骤。下载地址：&lt;a href="http://mvcmusicstore.codeplex.com/"&gt;http://mvcmusicstore.codeplex.com/&lt;/a&gt;  &lt;p&gt;它是一个简单的音乐商店，主要包含三个功能模块：购物，结算和后台管理。  &lt;p&gt;首先打开完整版，看一下运行效果：  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201112/201112091404487841.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://images.cnblogs.com/cnblogs_com/janes/201112/201112091404485050.jpg" width="558" height="304"&gt;&lt;/a&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201112/201112091404485399.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image003" border="0" alt="clip_image003" src="http://images.cnblogs.com/cnblogs_com/janes/201112/20111209140449100.png" width="480" height="329"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;3. 创建Music Store项目&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;然后从头开始，一步步搭建我们的音乐商店。  &lt;p&gt;新建项目，选项设置如下图所示：  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201112/20111209140449133.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image005" border="0" alt="clip_image005" src="http://images.cnblogs.com/cnblogs_com/janes/201112/201112091404497134.jpg" width="558" height="563"&gt;&lt;/a&gt;  &lt;ul&gt; &lt;li&gt;l Project template-&amp;gt;Empty  &lt;li&gt;l View engine-&amp;gt;Razor  &lt;li&gt;l User HTML5 semantic markup-&amp;gt;选中 &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;点击OK后查看解决方案发现已经创建了相应的文件夹。  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201112/201112091404504659.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image006" border="0" alt="clip_image006" src="http://images.cnblogs.com/cnblogs_com/janes/201112/201112091404502183.png" width="298" height="333"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;4. Controller&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;在Web Form开发的时候，网站中的URL经常和网页文件所在的磁盘目录相对应的，例如：&lt;a href="http://www.buy.com/Products.aspx"&gt;www.buy.com/Products.aspx&lt;/a&gt;可能对应着某个目录下的名为&amp;#8220;Products.aspx&amp;#8221;的文件。但是在MVC中不同，URL不是对应着具体的文件，而是对应着Controller类中的Controller Action方法。它负责处理HTML请求，操作用户的输入，进行数据读写，决定客户端的响应（如显示HTML，显示文件，页面跳转等）。  &lt;p&gt;&lt;strong&gt;① 添加首页HomeController:右击Contoller-&amp;gt;Add-&amp;gt;Controller &lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201112/201112091404504168.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image008" border="0" alt="clip_image008" src="http://images.cnblogs.com/cnblogs_com/janes/201112/201112091404506153.jpg" width="558" height="283"&gt;&lt;/a&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201112/201112091404516186.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image010" border="0" alt="clip_image010" src="http://images.cnblogs.com/cnblogs_com/janes/201112/201112091404515347.jpg" width="558" height="404"&gt;&lt;/a&gt;  &lt;p&gt;我们看到生成的HomeController代码如下：  &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt; &lt;p&gt;namespace MusicStore.Controllers&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class HomeController : Controller&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // GET: /Home/ &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public ActionResult Index()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return View();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;}&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;我们修改一下Index()方法如下：&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201112/20111209140451364.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image011" border="0" alt="clip_image011" src="http://images.cnblogs.com/cnblogs_com/janes/201112/201112091404513744.png" width="183" height="77"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;运行效果：  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201112/201112091404518760.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image012" border="0" alt="clip_image012" src="http://images.cnblogs.com/cnblogs_com/janes/201112/201112091404529873.png" width="295" height="125"&gt;&lt;/a&gt;  &lt;p&gt;&lt;strong&gt;② 添加商店StoreController，然后添加三个响应URL请求的方法： &lt;/strong&gt;&lt;/p&gt; &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt; &lt;p&gt;public class StoreController : Controller&lt;br&gt;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Index()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return "Hello from Store.Index()";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Browse(string genre)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string strMsg =HttpUtility.HtmlEncode( "Store.Browse,Genre=" + genre);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return strMsg;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Details(int ID)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string strMsg = "Store.Details,ID=" + ID;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return strMsg;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;strong&gt;③运行效果：&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Index()方法：&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201112/201112091404523810.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image013" border="0" alt="clip_image013" src="http://images.cnblogs.com/cnblogs_com/janes/201112/201112091404529383.png" width="426" height="160"&gt;&lt;/a&gt; &lt;/p&gt; &lt;ul&gt; &lt;li&gt;Browse方法中传递参数的方式很容易理解，跟在WebForm开发的时候一样都是【?key=value】&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201112/201112091404524956.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image014" border="0" alt="clip_image014" src="http://images.cnblogs.com/cnblogs_com/janes/201112/201112091404536941.png" width="448" height="151"&gt;&lt;/a&gt; &lt;/p&gt; &lt;ul&gt; &lt;li&gt;Details()方法中传递参数的形式比较特殊，因为MVC中处理URL中ActionMethod后面的参数时，默认对应的参数名称为&amp;#8220;ID&amp;#8221;。 &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/janes/201112/201112091404536974.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image015" border="0" alt="clip_image015" src="http://images.cnblogs.com/cnblogs_com/janes/201112/201112091404533419.png" width="393" height="158"&gt;&lt;/a&gt;&lt;/p&gt;   &lt;img src="http://www.cnblogs.com/janes/aggbug/2281949.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/janes/archive/2011/12/09/2281949.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
