<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_冠军</title><subtitle type="text">思胜.NET 高级培训</subtitle><id>http://feed.cnblogs.com/blog/u/17033/rss</id><updated>2012-02-07T14:29:03Z</updated><author><name>冠军</name><uri>http://www.cnblogs.com/haogj/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/haogj/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/17033/rss"/><entry><id>http://www.cnblogs.com/haogj/archive/2012/02/07/2342009.html</id><title type="text">装箱拆箱与对象的比较</title><summary type="text">看到这样的一道面试题：int i = 10;object obj = i;int j = (int) obj;分析一下程序执行中的内存处理。首先，我们可以看到这段程序定义了三个局部变量，局部变量将被定义在栈中，第一个变量比较简单，由于 i 是整形变量，所以变量 i 的值直接被保存在堆栈中。而第二行对 obj 的赋值要复杂一点点，由于 obj 的类型是 object 类型，这是引用类型，所以，在堆栈中保存的必须是一个对象的引用，而不能是一个值，此时，会发生著名的装箱，CLR 会在堆中创建一个对象，在这个对象中保存变量 i 的值，并且，还会同时保存这个值的类型，这里是整数类型。此时，在内存中将会.</summary><published>2012-02-07T14:23:00Z</published><updated>2012-02-07T14:23:00Z</updated><author><name>冠军</name><uri>http://www.cnblogs.com/haogj/</uri></author><link rel="alternate" href="http://www.cnblogs.com/haogj/archive/2012/02/07/2342009.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/haogj/archive/2012/02/07/2342009.html"/><content type="html">&lt;p&gt;看到这样的一道面试题：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;  i = &lt;span style="color: #800080;"&gt;10&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt; obj = i;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; j = (&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;) obj;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;分析一下程序执行中的内存处理。&lt;/p&gt;&#xD;
&lt;p&gt;首先，我们可以看到这段程序定义了三个局部变量，局部变量将被定义在栈中，第一个变量比较简单，由于 i 是整形变量，所以变量 i 的值直接被保存在堆栈中。&lt;/p&gt;&#xD;
&lt;p&gt;而第二行对 obj 的赋值要复杂一点点，由于 obj 的类型是 object 类型，这是引用类型，所以，在堆栈中保存的必须是一个对象的引用，而不能是一个值，此时，会发生著名的装箱，CLR 会在堆中创建一个对象，在这个对象中保存变量 i 的值，并且，还会同时保存这个值的类型，这里是整数类型。此时，在内存中将会存在两个 10，一个保存在栈中，一个保存在堆中。&lt;/p&gt;&#xD;
&lt;p&gt;有的人认为此时堆中对象中保存的值就是引用堆栈中 j 的值，这个问题我们可以验证一下，如果是这样的话，我们修改 i 的值，那么 obj 应该也会同时发生变化。我们可以在第二行之后增加两行检查一下i。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;i = &lt;span style="color: #800080;"&gt;99&lt;/span&gt;;&lt;br /&gt;Console.WriteLine( obj );&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;你可以看一看 obj 是否发生了变化。&lt;/p&gt;&#xD;
&lt;p&gt;第三行执行的时候，将一个引用类型的对象赋予一个值类型的变量 j，这时，会发生另外一个著名的事件：拆箱，CLR 会检查拆箱的类型是否匹配，然后从堆的对象中读取保存在其中的值，将这个值保存到位于堆栈中的变量 j 中。至此，在内存中已经存在了三个 10，两个在堆栈中，一个在堆中。如图所示：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/13475/2012020722042337.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;如果我们为上面的程序再增加一行：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt; obj2 = i;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;那么，又会发生什么情况呢？&lt;/p&gt;&#xD;
&lt;p&gt;有的人认为在堆中其实还是第二行中装箱的对象，此时的 obj2 引用的也是这个对象，内存中的结构如下所示：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/13475/2012020722182738.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;验证这个问题稍微复杂了一点，因为我们不能为 obj 赋值，赋值的话就是另外一个对象。而这个装箱的对象也没有什么方法让我们在不改变对象的情况下仅仅修改其中的值。&lt;/p&gt;&#xD;
&lt;p&gt;不过，我们还是有办法来检查它们是否为同一个对象的。&lt;/p&gt;&#xD;
&lt;p&gt;首先，我们可以考虑对象的 HashCode，在 Object 基类上定义了 GetHashCode 方法，可以返回对象的 Hash 码，通常我们可以通过比较对象的 HashCode 来判断引用的是否为同一个对象。那么，我们可以使用下面的语句来检查一下。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;Console.WriteLine( obj.GetHashCode() );&lt;br /&gt;Console.WriteLine( obj2.GetHashCode() );&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;不过，很不幸的是，你会看到输出了两次&amp;nbsp; 10，那么，它们是同一个对象吗？我们还不能这么说。&lt;/p&gt;&#xD;
&lt;p&gt;HashCode 的用途主要用在对象作为字典的键的时候，用来判断键是否相同，但是，有的时候，对于不同的对象我们也希望他们看作同样的键，因此这个 GetHashCode 方法实际上是虚方法，是可以被类型重写掉的。在整数类型中，这个方法已经被重写掉了，所以，你会看到具有同样值得整数返回的 HashCode 是相同的。&lt;/p&gt;&#xD;
&lt;p&gt;比如，你有两张 10 元的人民币，这两张人民币显然不是同一张，但是，他们的票面价格是相同的，无论你用那一张存到银行中，银行都会为你记下 10 元的存款，这称为值相等，也就是价值相同。Object 基类还定义了方法&amp;nbsp; Equals ，这个 Equals 方法就是用来判断值相等的。所以，在重写了 GetHashCode 方法之后，你应该也重写一下 Equals 方法，以保证值相等的比较。&lt;/p&gt;&#xD;
&lt;p&gt;回到我们的问题，我们显然需要判断的不是值相等，还有什么方法吗？有，Object 基类还有一个静态方法 ReferenceEquls，专门用来比较两个对象是否其实是同一个对象实例，这称为引用相等。因此，下面的代码可以轻易地用来完成这个任务。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;Console.WriteLine( Object.ReferenceEquals( obj, obj2 ) );&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;问题进行到这里，已经基本完成了。不过，CLR 又是怎么知道这两个对象是否为同一个对象的呢？在系统内部，每个对象在应用程序域中一旦诞生，CLR 都会赋予一个唯一的 HashCode ，虽然我们可以重写 GetHashCode，但是，这个内部的 HashCode 还是存在的，定义在命名空间 System.Runtime.ComilerServices 命名空间中的类 RuntimeHelpers 助手类就可以帮助我们解决这个问题，它的静态方法 GetHashCode 可以接受一个对象的引用，返回这个对象底层的 HashCode。&lt;/p&gt;&#xD;
&lt;p&gt;使用下面的代码，我们可以看到两个对象的 HashCode 真的是不同的。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;Console.WriteLine(System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode(obj));&lt;br /&gt;Console.WriteLine(System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode(obj2));&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;实际的内存结构应该如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/13475/2012020722213596.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;完整的代码如下所示：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i = &lt;span style="color: #800080;"&gt;10&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt; obj = i;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; j = (&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;)obj;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt; obj2 = i;&lt;br /&gt;&lt;br /&gt;Console.WriteLine(obj.GetHashCode());&lt;br /&gt;Console.WriteLine(obj2.GetHashCode());&lt;br /&gt;&lt;br /&gt;Console.WriteLine(Object.ReferenceEquals(obj, obj2));&lt;br /&gt;Console.WriteLine(System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode(obj));&lt;br /&gt;Console.WriteLine(System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode(obj2));&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/haogj/aggbug/2342009.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/haogj/archive/2012/02/07/2342009.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/haogj/archive/2012/01/29/2331219.html</id><title type="text">转载：搭建Silverlight 5中文开发环境</title><summary type="text">原文地址：http://social.msdn.microsoft.com/Forums/zh-CN/silverlightzhchs/thread/25d7a00f-7f08-4630-a6e7-002edd2877c7注：我参考原文配置了 Silverlight 的开发环境，但是原文的图片不能显示了，这里转载一下，顺便配上图片。Silverlight 5已于美国时间2011年12月9日正式发布，其在 Silverlight 4 的基础上新增了 40 多个新功能，完善了媒体支持并提供了更加丰富了用户界面。这个版本带来了很多改进，大家可以通过官方列表了解详情，或者点击此网页查看来自Pete B</summary><published>2012-01-29T08:19:00Z</published><updated>2012-01-29T08:19:00Z</updated><author><name>冠军</name><uri>http://www.cnblogs.com/haogj/</uri></author><link rel="alternate" href="http://www.cnblogs.com/haogj/archive/2012/01/29/2331219.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/haogj/archive/2012/01/29/2331219.html"/><content type="html">&lt;p&gt;&lt;span style="color: #000000;"&gt;原文地址：http://social.msdn.microsoft.com/Forums/zh-CN/silverlightzhchs/thread/25d7a00f-7f08-4630-a6e7-002edd2877c7&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;注：我参考原文配置了 Silverlight 的开发环境，但是原文的图片不能显示了，这里转载一下，顺便配上图片。&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;Silverlight 5已于美国时间2011年12月9日正式发布，&lt;/span&gt;其在 Silverlight 4 的基础上新增了 40 多个新功能，完善了媒体支持并提供了更加丰富了用户界面。这个版本带来了很多改进，大家可以通过&lt;a href="http://go.microsoft.com/fwlink/?LinkId=229308" rel="nofollow" target="_blank"&gt;&lt;span style="color: #0000ff;"&gt;官方列表&lt;/span&gt;&lt;/a&gt;了解详情，或者点击&lt;span style="color: #0000ff;"&gt;&lt;a href="http://www.silverlight.net/learn/overview" rel="nofollow" target="_blank"&gt;&lt;span style="color: #0000ff;"&gt;此网页&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;查看来自Pete Brown的多个视频介绍。&lt;/p&gt;&#xD;
&lt;p&gt;下面是对Silverlight 5新增功能的简要总结：&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;强数据绑定功能，包括上级绑定、隐式数据模板、自定义标签扩展等&lt;/li&gt;&#xD;
&lt;li&gt;新增3D图形类库，主要引入轻量级XNA 3D功能，该框架目前是XBOX游戏的主要开发框架，这也使得3D图形可以轻松地在Web网页中呈现&lt;/li&gt;&#xD;
&lt;li&gt;改进多媒体功能，包括使用XNA的声效库、支持H.264媒体硬件解码、变速播放、遥控器的按键支持（主要针对Live TV）等&lt;/li&gt;&#xD;
&lt;li&gt;增强文本功能，包括文本清晰度优化、文本块间漂移、矢量打印等&lt;/li&gt;&#xD;
&lt;li&gt;新增与操作系统的集成，包括支持P/Invoke调用外部程序、多窗体、在完全信任模式下无限制的文件系统访问、支持SaveFileDialog和Ope​​nFileDialog的默认文件名、64位浏览器支持等&lt;/li&gt;&#xD;
&lt;li&gt;优化整体性能，包括网络延迟的改进、使用TPL并行任务、解析器的性能改进、为改善启动时间的多核心JIT等&lt;/li&gt;&#xD;
&lt;li&gt;增强控件，包括双击与多击的支持、加入PivotViewer、ComboBox增强等&lt;/li&gt;&#xD;
&lt;li&gt;提高开发效率，包括XAML调试与数据绑定调试、团队测试的支持等&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;现在，Silverlight开发者可以点击下载正式版&lt;a href="http://go.microsoft.com/fwlink/?LinkId=229318" rel="nofollow" target="_blank"&gt;&lt;span style="color: #0000ff;"&gt;Silverlight 5 Tools&lt;/span&gt;&lt;/a&gt;和&lt;a href="http://silverlight.codeplex.com/" rel="nofollow" target="_blank"&gt;&lt;span style="color: #0000ff;"&gt;Silverlight 5 Toolkit&lt;/span&gt;&lt;/a&gt;（12月版）。&lt;span style="color: #000000;"&gt;可惜的是目前官方只发布了英文版开发包，按照惯例中文版一般要等到3-5个月之后才会发布，如果您使用的Visual Studio 2010是中文版，在安装时会出现语言不符的提示，但我们有办法将英文版开发包安装到中文开发环境中。下面是如何搭建Silverlight 5中文开发环境的具体步骤：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;1.首先确认您的Visual Studio 2010已经升级到SP1&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;2.解压下载下来的Silverlight5_Tools.exe(winrar 或者7-zip均可);&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/13475/2012012915471114.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;3.在解压后的目录中，打开ParameterInfo.xml，替换所有1033为2052，保存;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;4.运行同目录下SPInstaller.exe 安装Silverlight5 Tools;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/13475/2012012915480997.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;5.通常装完后,在VS中新建项目仍然不能使用Silverlight5,提示需要安装Silverlight4 Tools，此时需要修改注册表，在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\10.0\Setup\VS\BuildNumber下，将 "2052" 的值修改为 "10.0.30319"，然后安装Silverlight 4 Tools中文版程序（可以到&lt;/span&gt;&lt;a href="http://www.microsoft.com/downloads/zh-cn/details.aspx?FamilyID=b3deb194-ca86-4fb6-a716-b67c2604a139&amp;amp;displayLang=zh-cn" rel="nofollow" target="_blank"&gt;&lt;span style="color: #0000ff;"&gt;这里&lt;/span&gt;&lt;/a&gt;&lt;span style="color: #000000;"&gt;下载）;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;不过，在我这里，安装完成之后就已经没有问题了。&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;6.安装完Silverlight 4 Tools后,将上述注册表中中修改的 &amp;ldquo;2052&amp;rdquo;值还原为&amp;ldquo;10.0.40219&amp;rdquo;。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;通常如果您需要设计Silverlight应用，还需要使用Blend来进行界面设计，对应Silverlight5的版本请&lt;/span&gt;&lt;a href="http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;amp;id=9503" rel="nofollow" target="_blank"&gt;&lt;span style="color: #0000ff;"&gt;点击这里&lt;/span&gt;&lt;/a&gt;&lt;span style="color: #000000;"&gt;下载。现在，我们就可以尽情体验Silverlight 5给我们带来的新特性了。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;笔者在新书中精心制作了Silverlight 5的新功能示例，大家可以&lt;span style="color: #0d0d0d;"&gt;点击&lt;/span&gt;&lt;a href="http://space.silverlightchina.net/xpeter/demo/" rel="nofollow" target="_blank"&gt;&lt;span style="color: #0000ff;"&gt;此示例网页&lt;/span&gt;&lt;/a&gt;来体验。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;注意：部分示例需要安装后才能查看，对于3D示例需要在Silverlight右键的&amp;ldquo;权限&amp;rdquo;选项卡中允许3D显示，如下图。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/haogj/aggbug/2331219.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/haogj/archive/2012/01/29/2331219.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/haogj/archive/2012/01/17/2325073.html</id><title type="text">DOM 中的事件处理</title><summary type="text">根据 W3C DOM 2 Events 描述，EventTarget 接口被所有支持 DOM 事件模型的节点（Node）实现。 该接口提供了 &amp;#39;addEventListener&amp;#39; 和 &amp;#39;removeEventListener&amp;#39; 方法，用来绑定或解绑一个 EventListeners 接口到一个 EventTarget。DOM 2 Events 中定义了 Event 接口，用来提供事件的上下文信息，它提供了若干标准属性和方法。 实现 Event 接口的对象一般作为第一个参数传入事件处理函数，以用来提供当前事件相关的一些信息。事件注册根据 DOM 2 Events </summary><published>2012-01-17T14:46:00Z</published><updated>2012-01-17T14:46:00Z</updated><author><name>冠军</name><uri>http://www.cnblogs.com/haogj/</uri></author><link rel="alternate" href="http://www.cnblogs.com/haogj/archive/2012/01/17/2325073.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/haogj/archive/2012/01/17/2325073.html"/><content type="html">&lt;p&gt;根据 W3C DOM 2 Events 描述，EventTarget 接口被所有支持 DOM 事件模型的节点（Node）实现。 该接口提供了 'addEventListener' 和 'removeEventListener' 方法，用来绑定或解绑一个 EventListeners 接口到一个 EventTarget。&lt;/p&gt;&#xD;
&lt;p&gt;DOM 2 Events 中定义了 Event 接口，用来提供事件的上下文信息，它提供了若干标准属性和方法。 实现 Event 接口的对象一般作为第一个参数传入事件处理函数，以用来提供当前事件相关的一些信息。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;事件注册&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;根据 DOM 2 Events 中描述，节点使用 '&lt;strong&gt;addEventListener&lt;/strong&gt;' 和 '&lt;strong&gt;removeEventListener&lt;/strong&gt;' 方法绑定和解绑事件监听器，但 IE6 IE7 IE8 不支持这两个方法， 而使用 '&lt;strong&gt;attachEvent&lt;/strong&gt;' 和 '&lt;strong&gt;detachEvent&lt;/strong&gt;' 方法作为替代方案，Opera 两类方法都支持。Chrome Safari Firefox 只支持标准方法。&lt;/p&gt;&#xD;
&lt;p&gt;为了解决浏览器兼容问题，可以自定义函数来解决。例如：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; EventUtil = {&lt;br /&gt;    addHandler: &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; (element, type, handler) {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (element.addEventListener) {&lt;br /&gt;            element.addEventListener(type, handler, &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;);&lt;br /&gt;        } &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (element.attachEvent) {&lt;br /&gt;            element.attachEvent("on" + type, handler);&lt;br /&gt;        } &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; {&lt;br /&gt;            element["on" + type] = handler;&lt;br /&gt;        }&lt;br /&gt;    },&lt;br /&gt;    removeHandler: &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; (element, type, handler) {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (element.removeEventListener) {&lt;br /&gt;            element.removeEventListener(type, handler, &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;);&lt;br /&gt;        } &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (element.detachEvent) {&lt;br /&gt;            element.detachEvent("on" + type, handler);&lt;br /&gt;        } &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; {&lt;br /&gt;            element["on" + type] = &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;};&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;关于 'addEventListener' 和 'attachEvent' 有几点需要注意：&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;IE 不支持在捕获阶段触发事件监听器，'attachEvent' 方法没有提供参数说明是否响应在捕获阶段触发的事件；&lt;/li&gt;&#xD;
&lt;li&gt;'addEventListener' 和 'attachEvent' 都可以注册多个事件监听器；&lt;/li&gt;&#xD;
&lt;li&gt;在 Firefox Chrome Safari Opera 中给同一事件注册同一个事件监听器多次，重复注册的会被丢弃；而在 IE 中重复注册的事件监听器会被重复执行多次；&lt;/li&gt;&#xD;
&lt;li&gt;当给同一元素注册了多个事件监听器的时候，IE6 IE7 的事件监听器执行顺序是随机的，IE8 是倒序的，Firefox Chrome Safari Opera 是顺序的；&lt;/li&gt;&#xD;
&lt;li&gt;当元素注册的事件监听器中有非法的事件监听器时（非函数），在 IE Firefox 中会抛出异常，而在 Chrome Safari Opera 中则会忽略非法的事件监听器，继续执行其他的事件监听器。&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;strong&gt;事件对象&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在ie中，事件对象是作为一个全局变量来保存和维护的。 所有的浏览器事件,不管是用户触发的，还是其他事件， 都会更新window.event 对象。 所以在代码中，只要轻松调用 window.event 就可以轻松获取 事件对象， 再 event.srcElement 就可以取得触发事件的元素进行进一步处理。&lt;/p&gt;&#xD;
&lt;p&gt;对于标准的 DOM 处理来说， 事件对象却不是全局对象，一般情况下，是现场发生，现场使用，把事件对象自动传递给对应的事件处理函数。 在代码中，函数的第一个参数就是事件对象了。&lt;/p&gt;&#xD;
&lt;p&gt;为了解决兼容性问题，通常在代码中如下处理：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; handler(e){&lt;br /&gt;  e = e || window.event;&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;需要注意的是，使用 &lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;button&amp;nbsp;id&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;btn&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;onclick&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;foo()&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;按钮1&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;button&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt; 进行事件注册，标准方式下却不能在事件处理方法中取得事件对象。&lt;/p&gt;&#xD;
&lt;p&gt;原因是　onclick="foo()"&amp;nbsp;&amp;nbsp; 就是直接执行了， foo() 函数,没有任何参数传递给 foo 函数。&lt;/p&gt;&#xD;
&lt;p&gt;有两个办法解决这个问题。&lt;/p&gt;&#xD;
&lt;p&gt;第一，将注册的方法修改为 &lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;button&amp;nbsp;id&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;btn&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;onclick&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;foo(event)&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;按钮&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;button&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;，注意，这里的 event 不是形参，而是实参，必须名为 event。这样 foo 函数就可以得到事件参数了。&lt;/p&gt;&#xD;
&lt;p&gt;第二，不修改注册的代码，在事件处理方法上进行处理。关键在于此时实际上存在事件对象，只不过没有传递给 foo 函数罢了，我们可以找到调用 foo 函数的那个函数，当然这是一个系统函数，没有关系，通过 foo.&lt;strong&gt;caller&lt;/strong&gt; 可以取得当前调用 foo 函数的函数，这个函数的第一个参数就是事件对象，所以，我们可以这样取得这个事件对象了。&lt;strong&gt;foo.caller.&lt;span style="color: #000000;"&gt;arguments[&lt;/span&gt;&lt;span style="color: #000000;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;]&lt;/span&gt;&lt;/strong&gt;。&lt;/p&gt;&#xD;
&lt;p&gt;注意：&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;只有在使用 &lt;strong&gt;attachEvent&lt;/strong&gt; 方法注册事件监听器的时候，&lt;strong&gt;IE&lt;/strong&gt; 才支持使用事件监听器传入的第一个参数作为事件对象的方式；&lt;/li&gt;&#xD;
&lt;li&gt;Chrome Safari Opera 两种获取事件对象的方式都支持；&lt;/li&gt;&#xD;
&lt;li&gt;Firefox 只支持获取事件对象的标准方式。&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;strong&gt;事件对象的属性&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;IE 对事件对象的标准属性和方法支持有限，针对大部分属性和方法，IE 都提供了一套替代非标准的替代方案； 而 Firefox Chrome Safari Opera 除了全面支持事件对象的标准属性和方法外，还在不同程度上支持了 IE 提供的非标准替代方案。&lt;/p&gt;&#xD;
&lt;p&gt;使用特性判断使用与标准对应的非标准方法及属性&lt;/p&gt;&#xD;
&lt;p&gt;target　　　　　　　　　　srcElement&lt;/p&gt;&#xD;
&lt;p&gt;preventDefault()　　　　　returnValue&lt;/p&gt;&#xD;
&lt;p&gt;stopPropagation()　　　　cancelBubble&lt;/p&gt;&#xD;
&lt;p&gt;relatedTarget　　　　　　fromElement toElement&lt;/p&gt;&#xD;
&lt;p&gt;例如：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;getEvent: &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; (event) {&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; event ? event : window.event;&lt;br /&gt;},&lt;br /&gt;getTarget: &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; (event) {&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; event.target || event.srcElement;&lt;br /&gt;},&lt;br /&gt;preventDefault: &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; (event) {&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (event.preventDefault) {&lt;br /&gt;        event.preventDefault();&lt;br /&gt;    } &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; {&lt;br /&gt;        event.returnValue = &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;},&lt;br /&gt;stopPropagation: &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; (event) {&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (event.stopPropagation) {&lt;br /&gt;        event.stopPropagation();&lt;br /&gt;    } &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; {&lt;br /&gt;        event.cancelBubble = &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;br /&gt;参考资料：&lt;/p&gt;&#xD;
&lt;p &gt;&lt;a href="http://w3help.org/zh-cn/causes/SD9011" target="_blank"&gt;SD9011: 事件模型在各浏览器中存在差异&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/haogj/aggbug/2325073.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/haogj/archive/2012/01/17/2325073.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/haogj/archive/2011/12/15/2289393.html</id><title type="text">在 jQuery 中与 WCF 传递日期类型的参数</title><summary type="text">通过 WCF 与页面进行 Ajax 进行数据传递非常方便，可以，遇到日期类型就不同了。WCF 通过 JavaScriptSerializer将日期格式化为特殊的格式：\/Date(1318287600+0100)\/，实际上传递到页面上的是一个字符串。而不是真正的 JavaScript 日期。同样，当浏览器想要向服务器传递日期类型的数据时也必须通过这种特殊的字符串来提供数据。为了解决这个问题，可以使用下面的方法为 jQuery 扩展一个数据转换的方法。// 为 jQuery 扩展一个解析 wcf 日期的方法jQuery.extend( { w...</summary><published>2011-12-15T12:47:00Z</published><updated>2011-12-15T12:47:00Z</updated><author><name>冠军</name><uri>http://www.cnblogs.com/haogj/</uri></author><link rel="alternate" href="http://www.cnblogs.com/haogj/archive/2011/12/15/2289393.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/haogj/archive/2011/12/15/2289393.html"/><content type="html">&lt;p&gt;通过 WCF 与页面进行 Ajax 进行数据传递非常方便，可以，遇到日期类型就不同了。&lt;/p&gt;&#xD;
&lt;p&gt;WCF 通过 &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.aspx"&gt;JavaScriptSerializer&lt;/a&gt;&amp;nbsp;将日期格式化为特殊的格式：\/Date(1318287600+0100)\/，实际上传递到页面上的是一个字符串。而不是真正的 JavaScript 日期。&lt;/p&gt;&#xD;
&lt;p&gt;同样，当浏览器想要向服务器传递日期类型的数据时也必须通过这种特殊的字符串来提供数据。&lt;/p&gt;&#xD;
&lt;p&gt;为了解决这个问题，可以使用下面的方法为 jQuery 扩展一个数据转换的方法。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 为 jQuery 扩展一个解析 wcf 日期的方法&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;jQuery.extend(&lt;br /&gt;            {&lt;br /&gt;                wcfDate2JsDate: &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; (wcfDate) {&lt;br /&gt;                    &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; date = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Date(parseInt(wcfDate.substring(6)));&lt;br /&gt;                    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; date;&lt;br /&gt;                },&lt;br /&gt;                jsDate2WcfDate: &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; (jsDate) {&lt;br /&gt;                    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; \/Date(568310400000+0800)\/&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; "\/Date(" + jsDate.getTime() + "+0000)\/";&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        );&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;在页面中引用 jQuery 脚本文件之后，加入这段脚本即可。&lt;/p&gt;&#xD;
&lt;p&gt;可以如下方式来使用：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; d = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Date();      &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 标准的 JavaScript 日期数据&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;alert(d);&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; wcf = $.jsDate2WcfDate(d);    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 转换为 WCF 日期格式&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;alert(wcf);&lt;br /&gt;&lt;br /&gt;alert($.wcfDate2JsDate(wcf));       &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; WCF 日期格式转化为 JavaScript 日期格式&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;当然，可以将这段脚本保存在一个文件中，以后在页面中直接引用即可。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://files.cnblogs.com/haogj/jQuery-WcfDate.js" target="_blank"&gt;下载脚本文件&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/haogj/aggbug/2289393.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/haogj/archive/2011/12/15/2289393.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/haogj/archive/2011/12/01/2271098.html</id><title type="text">jQuery 中使用 JSON</title><summary type="text">JSON 格式json 是 Ajax 中使用频率最高的数据格式，在浏览器和服务器中之间的通讯可离不开它。JSON 的格式说明可以在可以这里看到，非常详细，还是中文的。JSON 格式说明需要特别注意的是，在 JSON 中的属性名是需要使用引号引起来的。jQuery 中使用 JSONjQuery 是现在使用广泛的脚本库，那么，在 jQuery 中如何使用 JSON 呢？解析 JSON在 jQuery 中已经提供了对于解析 JSON 的内在支持，jQuery.parseJSON 函数提供了解析的支持，详细的说明见这里。var obj = jQuery.parseJSON(&amp;#39;{&amp;quot;na</summary><published>2011-12-01T11:38:00Z</published><updated>2011-12-01T11:38:00Z</updated><author><name>冠军</name><uri>http://www.cnblogs.com/haogj/</uri></author><link rel="alternate" href="http://www.cnblogs.com/haogj/archive/2011/12/01/2271098.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/haogj/archive/2011/12/01/2271098.html"/><content type="html">&lt;p&gt;&lt;strong&gt;&lt;strong&gt;JSON 格式&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;json 是 Ajax 中使用频率最高的数据格式，在浏览器和服务器中之间的通讯可离不开它。&lt;/p&gt;&#xD;
&lt;p&gt;JSON 的格式说明可以在可以这里看到，非常详细，还是中文的。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.json.org/json-zh.html" target="_blank"&gt;&lt;img src="http://www.json.org/img/json160.gif" alt="" /&gt;&amp;nbsp;JSON 格式说明&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;需要特别注意的是，在 JSON 中的属性名是需要使用引号引起来的。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;jQuery 中使用 JSON&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;jQuery 是现在使用广泛的脚本库，那么，在 jQuery 中如何使用 JSON 呢？&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://static.jquery.com/files/rocker/images/logo_jquery_215x53.gif" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;解析 JSON&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在 jQuery 中已经提供了对于解析 JSON 的内在支持，&lt;/p&gt;&#xD;
&lt;p&gt;jQuery.parseJSON 函数提供了解析的支持，&lt;a href="http://api.jquery.com/jQuery.parseJSON/" target="_blank"&gt;详细的说明见这里&lt;/a&gt;。&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; obj = jQuery.parseJSON('{"name":"John"}');  &lt;br /&gt;alert( obj.name === "John" );  &lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;使用对象生成 JSON 格式串&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在 jQuery 中并没有提供直接将普通的 JavaScript 对象转换为 JSON 串的方法，可以使用下面的扩展库来完成。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;jquery-json 扩展库&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这个库用来扩展 jQuery ，对于 JSON 的使用，扩展了两个方法。&lt;/p&gt;&#xD;
&lt;p&gt;toJSON 方法用来将一个普通的 JavaScript 对象序列化为 JSON 串。&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; thing = {plugin: 'jquery-json', version: 2.3};    &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; encoded = $.toJSON( thing ); &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; '{"plugin":"jquery-json","version":2.3}' &lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;p&gt;evalJSON 方法将一个 JSON 串解析为一个普通的 JavaScript 对象。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; thing = {plugin: 'jquery-json', version: 2.3};    &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; encoded = $.toJSON( thing ); &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; '{"plugin":"jquery-json","version":2.3}'   &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; name = $.evalJSON( encoded ).plugin; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; "jquery-json"   &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; version = $.evalJSON(encoded).version; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 2.3 &lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;这个扩展的下载地址：&lt;a href="http://code.google.com/p/jquery-json/" target="_blank"&gt;http://code.google.com/p/jquery-json/&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;使用 jQuery 配合 WCF &lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;客户端&lt;br /&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;jQuery 中的 $.post 可以直接向服务器发出请求，将服务器返回的数据按照 JSON 方式进行解析，不过，需要注意下面几点：&lt;/p&gt;&#xD;
&lt;p&gt;请求的内容类型必须为&amp;nbsp; json 格式，这可以通过上面的 jQuery-json 扩展库来完成，需要特别注意的在请求的 contentType 也必须使用&amp;nbsp; text/json 进行说明，默认的 post 使用普通的名值对方式请求，因此 contentType 是： application/x-www-form-urlencoded，可以通过 $.ajaxSetup 来进行设置：&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Ajax 设置  &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;$.ajaxSetup({ contentType: 'text/json' });  &lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;这样，请求的内容类型就设置为需要的类型。&lt;/p&gt;&#xD;
&lt;p&gt;其次，实际的请求内容必须使用 JSON 方式，这可以通过扩展库的 $.toJSON 来实现，例如：&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;$.toJSON({ x: 2, y: 3 })&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p &gt;&lt;span&gt;&lt;span&gt;&amp;nbsp; &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;这样，如果服务器端提供了一个服务方法 Sum，定义如下：&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; Sum(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; x, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; y)  &lt;br /&gt;{  &lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; x + y;  &lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;span&gt;&lt;br /&gt;&lt;/span&gt;就可以如下调用了。注意，WCF 返回的数据在属性 d 中。&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Ajax 设置  &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;$.ajaxSetup({ contentType: 'text/json' });  &lt;br /&gt;&lt;br /&gt;$("#wcfBtn").click(&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; () {  &lt;br /&gt;    $.post("Service1.svc/Sum", $.toJSON({ x: 2, y: 3 }), &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; (data) {  &lt;br /&gt;        alert(data.d);  &lt;br /&gt;    });  &lt;br /&gt;});  &lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;服务器端的配置&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;首先，为服务增加标签：[System.ServiceModel.Activation.AspNetCompatibilityRequirements(&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; RequirementsMode = System.ServiceModel.Activation.AspNetCompatibilityRequirementsMode.Allowed)]&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; #1  &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 为了在脚本中使用,必须增加这个标签  &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;[System.ServiceModel.Activation.AspNetCompatibilityRequirements( &lt;br /&gt;    RequirementsMode = System.ServiceModel.Activation.AspNetCompatibilityRequirementsMode.Allowed)]  &lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; #2  &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 在网站的配置文件中也需要进行设定  &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; Service1 : IService1  &lt;br /&gt;{  &lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; Sum(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; x, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; y)  &lt;br /&gt;    {  &lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; x + y;  &lt;br /&gt;    }  &lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;span&gt;&amp;nbsp; &lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;然后，在网站的配置文件中，如下配置。&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;system.serviceModel&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;  &lt;br /&gt;  &lt;span style="color: #008000;"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: #008000;"&gt; 为了支持在浏览器端调用 WCF 服务的特定配置 &lt;/span&gt;&lt;span style="color: #008000;"&gt;--&amp;gt;&lt;/span&gt;  &lt;br /&gt;  &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;serviceHostingEnvironment &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;aspNetCompatibilityEnabled&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="true"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;  &lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;serviceActivations&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;  &lt;br /&gt;&lt;br /&gt;      &lt;span style="color: #008000;"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: #008000;"&gt; relativeAddress 服务的地址  &lt;br /&gt;           service 实现服务的类型，全名，包含命名空间，甚至程序集  &lt;br /&gt;           factory 是 WCF 系统提供，直接使用  &lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #008000;"&gt;--&amp;gt;&lt;/span&gt;  &lt;br /&gt;&lt;br /&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;add &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;relativeAddress&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Service1.svc"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; service&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="MServer.Service1"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;  factory&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="System.ServiceModel.Activation.WebScriptServiceHostFactory"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;   &lt;br /&gt;           &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;  &lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;serviceActivations&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;  &lt;br /&gt;  &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;serviceHostingEnvironment&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;  &lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;behaviors&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;  &lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;serviceBehaviors&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;  &lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;behavior &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;=""&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;  &lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;serviceMetadata &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;httpGetEnabled&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="true"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;  &lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;serviceDebug &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;includeExceptionDetailInFaults&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="false"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;  &lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;behavior&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;  &lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;serviceBehaviors&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;  &lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;behaviors&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;system.serviceModel&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;br /&gt;&lt;br  title="view plain" /&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/haogj/aggbug/2271098.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/haogj/archive/2011/12/01/2271098.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/haogj/archive/2011/11/23/2246032.html</id><title type="text">ASP.NET MVC 音乐商店 - 目录</title><summary type="text">这一个系列的内容来自微软的音乐商店 Music Store, 这是项目在 Codeplex 上的地址：http://mvcmusicstore.codeplex.com/。这个项目使用 ASP.NET MVC3 完成，项目中除了提供完整的示例代码之外，还提供一个 100 多页的说明文档，这里的内容就翻译自这篇文档。在我学习这个项目的过程中，发现有一些地方与文档并不完全一致，项目中也引入了一些新的软件，在第一次使用的时候会比较陌生，因此，将整个项目使用中文 VS2010 重新完成一遍，将原文的界面全部替换为使用中文 VS2010 操作的界面，这样对大家可能会有一些帮助。ASP.NET MVC 音</summary><published>2011-11-23T14:50:00Z</published><updated>2011-11-23T14:50:00Z</updated><author><name>冠军</name><uri>http://www.cnblogs.com/haogj/</uri></author><link rel="alternate" href="http://www.cnblogs.com/haogj/archive/2011/11/23/2246032.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/haogj/archive/2011/11/23/2246032.html"/><content type="html">&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这一个系列的内容来自微软的音乐商店 Music Store, 这是项目在 Codeplex 上的地址：&lt;a href="http://mvcmusicstore.codeplex.com/" target="_blank"&gt;http://mvcmusicstore.codeplex.com/&lt;/a&gt;。&lt;/p&gt;&#xD;
&lt;p&gt;这个项目使用 ASP.NET MVC3 完成，项目中除了提供完整的示例代码之外，还提供一个 100 多页的说明文档，这里的内容就翻译自这篇文档。&lt;/p&gt;&#xD;
&lt;p&gt;在我学习这个项目的过程中，发现有一些地方与文档并不完全一致，项目中也引入了一些新的软件，在第一次使用的时候会比较陌生，因此，将整个项目使用中文 VS2010 重新完成一遍，将原文的界面全部替换为使用中文 VS2010 操作的界面，这样对大家可能会有一些帮助。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a id="ctl08_TitleUrl" href="http://www.cnblogs.com/haogj/archive/2011/11/08/2241710.html" target="_blank"&gt;ASP.NET MVC 音乐商店 - 0 概览&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a id="ctl08_TitleUrl" href="http://www.cnblogs.com/haogj/archive/2011/11/09/2241817.html" target="_blank"&gt;ASP.NET MVC 音乐商店 - 1 创建项目&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a id="ctl08_TitleUrl" href="http://www.cnblogs.com/haogj/archive/2011/11/10/2241824.html" target="_blank"&gt;ASP.NET MVC 音乐商店 - 2.控制器&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a id="ArchiveMonth1_Days_Entries_TitleUrl_0" href="http://www.cnblogs.com/haogj/archive/2011/11/11/2244895.html" target="_blank"&gt;ASP.NET MVC 音乐商店 - 3. 视图与模型&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a id="ArchiveMonth1_Days_Entries_TitleUrl_5" href="http://www.cnblogs.com/haogj/archive/2011/11/13/2246884.html" target="_blank"&gt;ASP.NET MVC 音乐商店 - 4. 数据访问&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a id="ArchiveMonth1_Days_Entries_TitleUrl_4" href="http://www.cnblogs.com/haogj/archive/2011/11/15/2249143.html" target="_blank"&gt;ASP.NET MVC 音乐商店 - 5. 通过支架创建编辑表单&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a id="ArchiveMonth1_Days_Entries_TitleUrl_3" href="http://www.cnblogs.com/haogj/archive/2011/11/15/2249147.html" target="_blank"&gt;ASP.NET MVC 音乐商店 - 5 通过支架创建编辑表单 续&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a id="ArchiveMonth1_Days_Entries_TitleUrl_2" href="http://www.cnblogs.com/haogj/archive/2011/11/16/2251920.html" target="_blank"&gt;ASP.NET MVC 音乐商店 - 6. 使用 DataAnnotations 进行模型验证&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a id="ArchiveMonth1_Days_Entries_TitleUrl_1" href="http://www.cnblogs.com/haogj/archive/2011/11/18/2253140.html" target="_blank"&gt;ASP.NET MVC 音乐商店 - 7.成员管理和授权&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a id="ArchiveMonth1_Days_Entries_TitleUrl_0" href="http://www.cnblogs.com/haogj/archive/2011/11/20/2255515.html" target="_blank"&gt;ASP.NET MVC 音乐商店 - 8. 使用 Ajax 更新的购物车&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a id="ctl08_TitleUrl" href="http://www.cnblogs.com/haogj/archive/2011/11/20/2255675.html" target="_blank"&gt;ASP.NET MVC 音乐商店 - 9. 注册和结账&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a id="ctl08_TitleUrl" href="http://www.cnblogs.com/haogj/archive/2011/11/20/2255680.html" target="_blank"&gt;ASP.NET MVC 音乐商店 - 10. 完成导航和站点的设计&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;除了上述的资料之外，还需要你已经安装了 VS2010 ，这里系列我们将使用中文版，这样更加方便一些，另外，你当然要安装 ASP.NET MVC3 的插件了，&lt;/p&gt;&#xD;
&lt;p&gt;首先是 ASP.NET MVC 3 RTM&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;，下载地址：&lt;a href="http://www.microsoft.com/downloads/zh-cn/details.aspx?familyid=d2928bc1-f48c-4e95-a064-2a455a22c8f6&amp;amp;displaylang=zh-cn" target="_blank"&gt;http://www.microsoft.com/downloads/zh-cn/details.aspx?familyid=d2928bc1-f48c-4e95-a064-2a455a22c8f6&amp;amp;displaylang=zh-cn&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;然后，为了更加高效地开发 MVC3 ，还需要安装一个更新：ASP.NET MVC 3 RTM Tools Update&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;，下载地址：&lt;a href="http://www.microsoft.com/downloads/zh-cn/details.aspx?FamilyID=82CBD599-D29A-43E3-B78B-0F863D22811A" target="_blank"&gt;http://www.microsoft.com/downloads/zh-cn/details.aspx?FamilyID=82CBD599-D29A-43E3-B78B-0F863D22811A&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/haogj/aggbug/2246032.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/haogj/archive/2011/11/23/2246032.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/haogj/archive/2011/11/21/2255680.html</id><title type="text">ASP.NET MVC 音乐商店 - 10. 完成导航和站点的设计</title><summary type="text">我们已经完成了网站的大部分工作，但是，还有一些添加到站点的导航功能，主页，以及商店的浏览页面。创建购物车汇总部分视图我们希望在整个站点的页面上都可以看到购物车中的数量。 通过创建一个部分视图，然后添加到网站的布局中就可以容易地完成，前面看到，在 ShoppingCart 控制器中包含了一个名为 CartSummary 的 Action 方法返回分部视图。//// GET: /ShoppingCart/CartSummary[ChildActionOnly]public ActionResult CartSummary(){ var cart = ShoppingCar...</summary><published>2011-11-21T11:32:00Z</published><updated>2011-11-21T11:32:00Z</updated><author><name>冠军</name><uri>http://www.cnblogs.com/haogj/</uri></author><link rel="alternate" href="http://www.cnblogs.com/haogj/archive/2011/11/21/2255680.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/haogj/archive/2011/11/21/2255680.html"/><content type="html">&lt;p&gt;我们已经完成了网站的大部分工作，但是，还有一些添加到站点的导航功能，主页，以及商店的浏览页面。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;创建购物车汇总部分视图&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;我们希望在整个站点的页面上都可以看到购物车中的数量。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/13475/2011112000330815.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;通过创建一个部分视图，然后添加到网站的布局中就可以容易地完成，&lt;/p&gt;&#xD;
&lt;p&gt;前面看到，在 ShoppingCart 控制器中包含了一个名为 CartSummary 的 Action 方法返回分部视图。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; GET: /ShoppingCart/CartSummary&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;[ChildActionOnly]&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ActionResult CartSummary()&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; cart = ShoppingCart.GetCart(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.HttpContext);&lt;br /&gt;    ViewData[&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;CartCount&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;] = cart.GetCount();&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; PartialView(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;CartSummary&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在这个 Action 方法上点击鼠标右键，或者在 Views/ShoppingCart 文件夹夹上点击鼠标右键，选择创建新视图，命名为 CartSummary ，注意选中创建分部视图的复选框。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/13475/2011112000381159.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;CartSummary 分部视图非常简单，仅仅链接到 ShoppingCart 的 Index ，显示当前购物车中的数量，完整的代码如下：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;@Html.ActionLink(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Cart (&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + ViewData[&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;CartCount&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;] + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;)&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Index&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;ShoppingCart&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; { id = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;cart-status&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; })&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在网站的任何页面中都可以包含分部视图，使用 Html.RenderAction 方法就可以。RenderAction 需要指定 Action 的名字，这里是 CartSummary，以及控制器的名字，这里是 ShoppingCart。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;@Html.RenderAction(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;CartSummary&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;ShoppingCart&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在将这个分部视图加入到布局之前，我们还要创建一个流派的菜单，这样我们可以一次更新完站点的 Site.master。&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;创建流派菜单的分部视图&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;通过在页面上增加一个流派的菜单，可以是用户在站点内导航的时候更加容易。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/13475/2011112000362113.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;我们可以使用类似前面的步骤来创建流派菜单的分部视图，把两个分部视图一起添加到站点的布局中，首先，在 StoreController 中增加 GenreMenu 的控制器方法。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; GET: /Store/GenreMenu&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;[ChildActionOnly]&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ActionResult GenreMenu()&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; genres = storeDB.Genres.ToList();&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; PartialView(genres);&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这个方法返回流派的列表，在后面创建的视图中用来生成菜单。&lt;/p&gt;&#xD;
&lt;p&gt;注意：在 Action 方法上我们增加了 [ChildActionOnly] 标注，这意味着我们仅仅可以通过分部视图来访问这个 Action，这可以防止通过浏览 /Store/GenreMenu 来访问，对于分部视图来说，这不是必须的，但是一个很好的实践，因为我们希望我们的控制器方法被我们希望的方式使用，这里我们还返回了一个分部视图而不是一个普通的视图，这用来告诉视图引擎，不需要对这个视图使用布局，它将会被包含在其他的视图中。&lt;/p&gt;&#xD;
&lt;p&gt;创建分部视图，使用强类型的 Genre 作为模型类型。使用 List 模板。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/13475/2011112000343390.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;更新生成的视图，显示一个列表。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;@model IEnumerable&amp;lt;MvcMusicStore.Models.Genre&amp;gt;&lt;br /&gt;&amp;lt;ul id=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;categories&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt;&lt;br /&gt;    @foreach (&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; genre &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; Model)&lt;br /&gt;    { &amp;lt;li&amp;gt;@Html.ActionLink(genre.Name,&lt;br /&gt;            &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Browse&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Store&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; { Genre = genre.Name }, &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;)&lt;br /&gt;    &amp;lt;/li&amp;gt;&lt;br /&gt;    }&lt;br /&gt;&amp;lt;/ul&amp;gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;更新站点的布局显示我们的分部视图&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;现在，可以在布局中加入分部视图了，在 /Views/Shared/_Layout.cshtml 中通过调用 Html.RenaderAction() 方法可以调用分部视图，把两个分部视图都加入到布局中，如下所示：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;    &amp;lt;title&amp;gt;@ViewBag.Title&amp;lt;/title&amp;gt;&lt;br /&gt;    &amp;lt;link href=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;@Url.Content(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;~/Content/Site.css&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;)&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; rel=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;stylesheet&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br /&gt;type=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;text/css&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; /&amp;gt;&lt;br /&gt;    &amp;lt;script src=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;@Url.Content(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;~/Scripts/jquery-&lt;span style="color: #800080;"&gt;1.4&lt;/span&gt;.&lt;span style="color: #800080;"&gt;4&lt;/span&gt;.min.js&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;)&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br /&gt;type=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;text/javascript&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;    &amp;lt;div id=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;header&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt;&lt;br /&gt;        &amp;lt;h1&amp;gt;&lt;br /&gt;            &amp;lt;a href=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt;ASP.NET MVC MUSIC STORE&amp;lt;/a&amp;gt;&amp;lt;/h1&amp;gt;&lt;br /&gt;        &amp;lt;ul id=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;navlist&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt;&lt;br /&gt;            &amp;lt;li &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;first&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt;&amp;lt;a href=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;@Url.Content(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;~&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;)&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; id=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;current&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt;Home&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;            &amp;lt;li&amp;gt;&amp;lt;a href=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;@Url.Content(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;~/Store/&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;)&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt;Store&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;            &amp;lt;li&amp;gt;&lt;br /&gt;                @{Html.RenderAction(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;CartSummary&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;ShoppingCart&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);}&lt;br /&gt;            &amp;lt;/li&amp;gt;&lt;br /&gt;            &amp;lt;li&amp;gt;&amp;lt;a href=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;@Url.Content(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;~/StoreManager/&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;)&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt;Admin&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;        &amp;lt;/ul&amp;gt;&lt;br /&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;    @{Html.RenderAction(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;GenreMenu&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Store&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);}&lt;br /&gt;    &amp;lt;div id=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;main&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt;&lt;br /&gt;        @RenderBody()&lt;br /&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;div id=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;footer&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt;&lt;br /&gt;        built with &amp;lt;a href=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;http://asp.net/mvc&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt;ASP.NET MVC &lt;span style="color: #800080;"&gt;3&lt;/span&gt;&amp;lt;/a&amp;gt;&lt;br /&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;更新 Store 的 Browse 页面&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;商店的浏览页面现在看来还不太好，我们更新这个页面在一个更好地布局中显示专辑，如下更新我们的视图。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;@model MvcMusicStore.Models.Genre &lt;br /&gt;@{ ViewBag.Title = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Browse Albums&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;; }&lt;br /&gt;&amp;lt;div &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;genre&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt;&lt;br /&gt;    &amp;lt;h3&amp;gt;&lt;br /&gt;        &amp;lt;em&amp;gt;@Model.Name&amp;lt;/em&amp;gt; Albums&amp;lt;/h3&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;ul id=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;album-list&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt;&lt;br /&gt;        @foreach (&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; album &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; Model.Albums)&lt;br /&gt;        { &amp;lt;li&amp;gt;&amp;lt;a href=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;@Url.Action(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;Details&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;, new { id = album.AlbumId })&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt;&lt;br /&gt;            &amp;lt;img alt=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;@album.Title&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; src=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;@album.AlbumArtUrl&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; /&amp;gt;&lt;br /&gt;            &amp;lt;span&amp;gt;@album.Title&amp;lt;/span&amp;gt; &amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt; }&lt;br /&gt;    &amp;lt;/ul&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这里，我们将使用 Url.Action 来代替 Html.ActionLink ，以便显示格式化信息，包括艺术家的插画。&lt;/p&gt;&#xD;
&lt;p&gt;注意：我们显示专辑的封面，这些信息保存在数据中，可以通过 StoreManager 进行编辑，也欢迎你加入你的插图。&lt;/p&gt;&#xD;
&lt;p&gt;现在，当我们浏览流派的时候，我们将会看到带有封面的专辑显示在一个网格中。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/13475/2011112119315086.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;更新主页来显示畅销专辑&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;我们希望在首页上增加畅销专辑来增进销售，我们在 HomeController 中增加一下内容来实现，然后增加一些额外的图片来变得更好。&lt;/p&gt;&#xD;
&lt;p&gt;首先，在我们的专辑中增加一个导航属性，以便与 EF 知道关联的的信息。专辑中最后的一行就是新增加的。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt; Genre Genre { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt; Artist Artist { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt; List&amp;lt;OrderDetail&amp;gt; OrderDetails { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;注意：这里使用了泛型的集合，需要在代码的前面使用 using 来引用 System.Collections.Generic 命名空间。&lt;/p&gt;&#xD;
&lt;p&gt;首先，我们将要增加 storeDB 的字段和引用 MusicStore.Models 命名空间，类似于其他的控制器。&lt;/p&gt;&#xD;
&lt;p&gt;然后，我们在 HomeController 中增加下面的方法，来查询数据库根据 OrderDetails 找到畅销的唱片。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; List&amp;lt;Album&amp;gt; GetTopSellingAlbums(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; count)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Group the order details by album and return&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; the albums with the highest count&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; storeDB.Albums&lt;br /&gt;    .OrderByDescending(a =&amp;gt; a.OrderDetails.Count())&lt;br /&gt;    .Take(count)&lt;br /&gt;    .ToList();&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这是私有方法，因为我们不希望直接可以访问到，这里为了简单将它写在了 HomeController 中，实际开发的时候，可能需要移到后台的逻辑服务中。&lt;/p&gt;&#xD;
&lt;p&gt;这里，我们更新 Index 来访问前面定义的方法，查询销售前 5 名的专辑，然后将他们传递到视图中。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ActionResult Index()&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Get most popular albums&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; albums = GetTopSellingAlbums(&lt;span style="color: #800080;"&gt;5&lt;/span&gt;);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; View(albums);&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;完整的代码如下：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System.Linq;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System.Web;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System.Web.Mvc;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; MvcMusicStore.Models;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt; MvcMusicStore.Controllers&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; HomeController : Controller&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; Models.MusicStoreEntities storeDB = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Models.MusicStoreEntities();&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; GET: /Home/&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ActionResult Index()&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Get most popular albums&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; albums = GetTopSellingAlbums(&lt;span style="color: #800080;"&gt;5&lt;/span&gt;);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; View(albums);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; List&amp;lt;Album&amp;gt; GetTopSellingAlbums(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; count)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Group the order details by album and return&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; the albums with the highest count&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; storeDB.Albums&lt;br /&gt;            .OrderByDescending(a =&amp;gt; a.OrderDetails.Count())&lt;br /&gt;            .Take(count)&lt;br /&gt;            .ToList();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;最后，我们需要更新我们的 Home 控制器的 Index 视图，访问模型在后面加入专辑的列表，借助这个时机，我们还要增加一个标头和一个促销的节。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;@model List&amp;lt;MvcMusicStore.Models.Album&amp;gt; &lt;br /&gt;@{&lt;br /&gt;    ViewBag.Title = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;ASP.NET MVC Music Store&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;; &lt;br /&gt;}&lt;br /&gt;&amp;lt;div id=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;promotion&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;h3&amp;gt;&lt;br /&gt;    &amp;lt;em&amp;gt;Fresh&amp;lt;/em&amp;gt; off the grill&amp;lt;/h3&amp;gt;&lt;br /&gt;&amp;lt;ul id=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;album-list&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt;&lt;br /&gt;    @foreach (&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; album &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; Model)&lt;br /&gt;    { &amp;lt;li&amp;gt;&amp;lt;a href=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;@Url.Action(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;Details&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;, &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;Store&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;,&lt;/span&gt;&lt;span style="color: #800000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; { id = album.AlbumId })&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;&lt;br /&gt;&lt;/span&gt;        &amp;lt;img alt=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;@album.Title&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; src=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;@album.AlbumArtUrl&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; /&amp;gt;&lt;br /&gt;        &amp;lt;span&amp;gt;@album.Title&amp;lt;/span&amp;gt; &amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;    }&lt;br /&gt;&amp;lt;/ul&amp;gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;现在，当运行程序的时候，我们将会看到更新后的主页，带有畅销的专辑和我们的促销信息。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/13475/2011112000451461.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/haogj/aggbug/2255680.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/haogj/archive/2011/11/21/2255680.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/haogj/archive/2011/11/20/2255675.html</id><title type="text">ASP.NET MVC 音乐商店 - 9. 注册和结账</title><summary type="text">在这一节，我们将创建结账的控制器 CheckoutController 来收集用户的地址和付款信息，我们需要用户在结账前注册账户，因为这个控制器需要授权。当用户点击结账 Checkout 按钮的时候，用户将会被导航到结账的处理流程中。如果用户没有登录，将会被提示需要登录。一旦用户成功登陆，用户就可以看到地址和付款的视图。一旦用户填写了这个表单并提交，他们将会看到订单的确认页面。视图访问不存在的订单，或者不属于你的订单，将会看到错误页面。合并购物车在匿名购物的时候，当用户点击结账 Checkout 按钮，用户会被要求注册和登陆，用户会希望继续使用原来的购物车，所以，在匿名用户登录之后，我们需要维</summary><published>2011-11-20T15:24:00Z</published><updated>2011-11-20T15:24:00Z</updated><author><name>冠军</name><uri>http://www.cnblogs.com/haogj/</uri></author><link rel="alternate" href="http://www.cnblogs.com/haogj/archive/2011/11/20/2255675.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/haogj/archive/2011/11/20/2255675.html"/><content type="html">&lt;p&gt;在这一节，我们将创建结账的控制器 CheckoutController 来收集用户的地址和付款信息，我们需要用户在结账前注册账户，因为这个控制器需要授权。&lt;/p&gt;&#xD;
&lt;p&gt;当用户点击结账 Checkout 按钮的时候，用户将会被导航到结账的处理流程中。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/13475/2011112000141043.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;如果用户没有登录，将会被提示需要登录。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/13475/2011112000144597.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;一旦用户成功登陆，用户就可以看到地址和付款的视图。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/13475/2011112000151054.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;一旦用户填写了这个表单并提交，他们将会看到订单的确认页面。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/13475/2011112000153539.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;视图访问不存在的订单，或者不属于你的订单，将会看到错误页面。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/13475/2011112000155396.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;合并购物车&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在匿名购物的时候，当用户点击结账 Checkout 按钮，用户会被要求注册和登陆，用户会希望继续使用原来的购物车，所以，在匿名用户登录之后，我们需要维护购物车。&lt;/p&gt;&#xD;
&lt;p&gt;实际上非常简单，因为 ShoppingCart 类已经提供了一个方法，通过当前的用户名来获取购物车中所有的项目，在用户注册登录以后，我们只需要调用这个方法。&lt;/p&gt;&#xD;
&lt;p&gt;打开在成员管理和授权中添加的 AccountController 类，增加一个 using 来引用 MvcMusicStore.Models，然后，增加 MigrateShoppingCart 方法。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; MigrateShoppingCart(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; UserName)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Associate shopping cart items with logged-in user&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; cart = ShoppingCart.GetCart(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.HttpContext);&lt;br /&gt;    cart.MigrateCart(UserName);&lt;br /&gt;    Session[ShoppingCart.CartSessionKey] = UserName;&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;然后，修改 LonOn 的 Post 处理方法，在用户通过验证之后，调用 MigrateShoppingCart&amp;nbsp; 方法。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; POST: /Account/LogOn&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;[HttpPost]&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ActionResult LogOn(LogOnModel model, &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; returnUrl)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (ModelState.IsValid)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (Membership.ValidateUser(model.UserName, model.Password))&lt;br /&gt;        {&lt;br /&gt;            MigrateShoppingCart(model.UserName);&lt;br /&gt;            FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (Url.IsLocalUrl(returnUrl) &amp;amp;&amp;amp; returnUrl.Length &amp;gt; &lt;span style="color: #800080;"&gt;1&lt;/span&gt; &amp;amp;&amp;amp; returnUrl.StartsWith(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)&lt;br /&gt;            &amp;amp;&amp;amp; !returnUrl.StartsWith(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;//&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;) &amp;amp;&amp;amp; !returnUrl.StartsWith(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;/\\&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;))&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; Redirect(returnUrl);&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; RedirectToAction(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Index&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Home&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;        {&lt;br /&gt;            ModelState.AddModelError(&lt;span style="color: #800000;"&gt;""&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;The user name or password provided is incorrect.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; If we got this far, something failed, redisplay form&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; View(model);&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在 Register 的 Post 处理方法中，一旦用户成功创建帐户，也进行类似的修改，&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; POST: /Account/Register&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;[HttpPost]&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ActionResult Register(RegisterModel model)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (ModelState.IsValid)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Attempt to register the user&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        MembershipCreateStatus createStatus;&lt;br /&gt;        Membership.CreateUser(model.UserName, model.Password, model.Email, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;question&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;answer&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;out&lt;/span&gt; createStatus);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (createStatus == MembershipCreateStatus.Success)&lt;br /&gt;        {&lt;br /&gt;            MigrateShoppingCart(model.UserName);&lt;br /&gt;            FormsAuthentication.SetAuthCookie(model.UserName, &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; createPersistentCookie &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; RedirectToAction(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Index&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Home&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;        {&lt;br /&gt;            ModelState.AddModelError(&lt;span style="color: #800000;"&gt;""&lt;/span&gt;, ErrorCodeToString(createStatus));&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; If we got this far, something failed, redisplay form&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; View(model);&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;就这样，现在匿名用户登录之后，购物车将会被自动传送过来。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;创建结账 CheckoutController 控制器&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在 Controller 文件夹上右键，添加一个新的控制器，命名为 CheckoutController ，使用空的控制器模板。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/13475/2011112000192530.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;首先，在控制器上增加授权的标注 [Authorize]，来确定用户必须在登录之后才能访问。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt; MvcMusicStore.Controllers&lt;br /&gt;{&lt;br /&gt;   [Authorize]&lt;br /&gt;   &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; CheckoutController : Controller&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;注意：这一步很像我们前面在 StoreManager 控制器上的工作，但是，在那个时候，我们要求用户必须拥有 Administrator 的角色。在结账控制器中，我们不需要用户必须是 Administrator ，而是必须登录。&lt;/p&gt;&#xD;
&lt;p&gt;出于简化的考虑，在这个教程中没有处理付款的信息，作为替代，我们允许用户输入一个促销代码，这里促销代码定义在常量 PromoCode。&lt;/p&gt;&#xD;
&lt;p&gt;像在 StoreController 中一样，在控制器中，我们也需要定义 MusicStoreEntities 的字段，将它命名为 storeDB，结账的开始部分如下。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; MvcMusicStore.Models;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt; MvcMusicStore.Controllers&lt;br /&gt;{&lt;br /&gt;    [Authorize]&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; CheckoutController : Controller&lt;br /&gt;    {&lt;br /&gt;        MusicStoreEntities storeDB = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; MusicStoreEntities();&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; PromoCode = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;FREE&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;结账的控制器将包含下面的控制器方法：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;AddressAndPayment ( Get )&lt;/strong&gt; 用来显示一个用户输入信息的表单&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;AddressAndPayment ( Post )&lt;/strong&gt; 验证用户的输入，处理订单。&lt;/p&gt;&#xD;
&lt;p&gt;Complete 用来在在用户完成订单之后显示，这个视图包含用户的订单账号和确认信息。&lt;/p&gt;&#xD;
&lt;p&gt;首先，将 Index 方法改名为 AddressAndPayment， 这个 Action 方法用来显示结账表单，所以，不需要任何的模型信息。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; GET: /Checkout/AddressAndPayment&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ActionResult AddressAndPayment()&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; View();&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;AddressAndPayment 的 Post 处理方法使用我们在 StoreManagerController 中类似的模式：如果成功了就完成订单，如果失败了就重新显示表单。&lt;/p&gt;&#xD;
&lt;p&gt;在验证了表单之后，我们将会直接检查促销代码，假设所有的信息都是正确的，我们将会在订单中保存信息，告诉购物车对象完成订单处理，最后，重定向到完成的 Complete Action 方法。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;[HttpPost]&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ActionResult AddressAndPayment(FormCollection values)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; order = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Order();&lt;br /&gt;    TryUpdateModel(order);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;try&lt;/span&gt;&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.Equals(values[&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;PromoCode&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;], PromoCode,&lt;br /&gt;        StringComparison.OrdinalIgnoreCase) == &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; View(order);&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;        {&lt;br /&gt;            order.Username = User.Identity.Name;&lt;br /&gt;            order.OrderDate = DateTime.Now;&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;Save Order&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            storeDB.Orders.Add(order);&lt;br /&gt;            storeDB.SaveChanges();&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;Process the order&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; cart = ShoppingCart.GetCart(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.HttpContext);&lt;br /&gt;            cart.CreateOrder(order);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; RedirectToAction(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Complete&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; { id = order.OrderId });&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;catch&lt;/span&gt;&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;Invalid - redisplay with errors&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; View(order);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;一旦完成了结账处理，用户将被重定向到 Complete 方法， 这个 Action 方法将会进行简单的检查，在显示订单号之前，检查订单是否属于当前登录的用户。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; GET: /Checkout/Complete&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ActionResult Complete(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; id)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Validate customer owns this order&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; isValid = storeDB.Orders.Any(&lt;br /&gt;    o =&amp;gt; o.OrderId == id &amp;amp;&amp;amp;&lt;br /&gt;    o.Username == User.Identity.Name);&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (isValid)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; View(id);&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; View(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Error&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;注意，错误视图创建项目的时候，保存在&amp;nbsp; /Views/Shared 文件夹中的 error.cshtml 生成。&lt;/p&gt;&#xD;
&lt;p&gt;完整的 CheckoutController 如下所示.&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System.Linq;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System.Web;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System.Web.Mvc;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; MvcMusicStore.Models;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt; MvcMusicStore.Controllers&lt;br /&gt;{&lt;br /&gt;    [Authorize]&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; CheckoutController : Controller&lt;br /&gt;    {&lt;br /&gt;        MusicStoreEntities storeDB = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; MusicStoreEntities();&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; PromoCode = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;FREE&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; GET: /Checkout/AddressAndPayment&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ActionResult AddressAndPayment()&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; View();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        [HttpPost]&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ActionResult AddressAndPayment(FormCollection values)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; order = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Order();&lt;br /&gt;            TryUpdateModel(order);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;try&lt;/span&gt;&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.Equals(values[&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;PromoCode&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;], PromoCode,&lt;br /&gt;                StringComparison.OrdinalIgnoreCase) == &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;)&lt;br /&gt;                {&lt;br /&gt;                    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; View(order);&lt;br /&gt;                }&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;                {&lt;br /&gt;                    order.Username = User.Identity.Name;&lt;br /&gt;                    order.OrderDate = DateTime.Now;&lt;br /&gt;                    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;Save Order&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                    storeDB.Orders.Add(order);&lt;br /&gt;                    storeDB.SaveChanges();&lt;br /&gt;                    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;Process the order&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                    &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; cart = ShoppingCart.GetCart(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.HttpContext);&lt;br /&gt;                    cart.CreateOrder(order);&lt;br /&gt;                    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; RedirectToAction(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Complete&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&lt;br /&gt;                    &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; { id = order.OrderId });&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;catch&lt;/span&gt;&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;Invalid - redisplay with errors&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; View(order);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; GET: /Checkout/Complete&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ActionResult Complete(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; id)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Validate customer owns this order&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; isValid = storeDB.Orders.Any(&lt;br /&gt;            o =&amp;gt; o.OrderId == id &amp;amp;&amp;amp;&lt;br /&gt;            o.Username == User.Identity.Name);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (isValid)&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; View(id);&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; View(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Error&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;增加 AddressAndPayment 视图&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;现在，我们创建 AddressAndPayment 视图，在 AddressAndPayment 控制器的某个 Action 中点击鼠标的右键，增加名为 AddressAndPayment 的强类型 Order 视图，使用编辑模板。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/13475/2011112000262510.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这个视图使用我们在 StoreManager 的 Edit 视图中使用的两个技术：&lt;/p&gt;&#xD;
&lt;p&gt;1.使用 Html.EditorForModel() 来显示订单模型的字段&lt;/p&gt;&#xD;
&lt;p&gt;2.使用 Order 模型的验证标签定义验证规则&lt;/p&gt;&#xD;
&lt;p&gt;我们先使用 Html.EditorForModel() 方法，然后，增加额外的输入框用来输入促销码，完成的视图如下。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;@model MvcMusicStore.Models.Order&lt;br /&gt;@{&lt;br /&gt;    ViewBag.Title = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Address And Payment&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&amp;lt;script src=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;@Url.Content(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;~/Scripts/jquery.validate.min.js&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;)&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; type=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;text/javascript&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script src=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;@Url.Content(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;~/Scripts/jquery.validate.unobtrusive.min.js&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;)&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; type=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;text/javascript&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;@using (Html.BeginForm())&lt;br /&gt;{&lt;br /&gt;    &amp;lt;h2&amp;gt;&lt;br /&gt;        Address And Payment&amp;lt;/h2&amp;gt;&lt;br /&gt;    &amp;lt;fieldset&amp;gt;&lt;br /&gt;        &amp;lt;legend&amp;gt;Shipping Information&amp;lt;/legend&amp;gt;&lt;br /&gt;        @Html.EditorForModel()&lt;br /&gt;    &amp;lt;/fieldset&amp;gt;&lt;br /&gt;    &amp;lt;fieldset&amp;gt;&lt;br /&gt;        &amp;lt;legend&amp;gt;Payment&amp;lt;/legend&amp;gt;&lt;br /&gt;        &amp;lt;p&amp;gt;&lt;br /&gt;            We&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;re running a promotion: all music is free with the promo code: "FREE"&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;&lt;br /&gt;&lt;/span&gt;        &amp;lt;div &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;editor-label&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt;&lt;br /&gt;            @Html.Label(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Promo Code&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)&lt;br /&gt;        &amp;lt;/div&amp;gt;&lt;br /&gt;        &amp;lt;div &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;editor-field&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt;&lt;br /&gt;            @Html.TextBox(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;PromoCode&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)&lt;br /&gt;        &amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;/fieldset&amp;gt;&lt;br /&gt;    &amp;lt;input type=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;submit&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; value=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Submit Order&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; /&amp;gt;&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;定义订单的验证规则&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;现在，我们的视图已经创建了，类似于专辑，我们定义订单的验证规则。在 Models 文件夹上点击鼠标的右键，增加名为 Order 的模型类，我们使用专辑中使用过的验证标注，我们还将使用正则表达式来验证用户的电子邮件地址。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System.ComponentModel;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System.ComponentModel.DataAnnotations;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System.Web.Mvc;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt; MvcMusicStore.Models&lt;br /&gt;{&lt;br /&gt;    [Bind(Exclude = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;OrderId&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)]&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;partial&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; Order&lt;br /&gt;    {&lt;br /&gt;        [ScaffoldColumn(&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;)]&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; OrderId { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        [ScaffoldColumn(&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;)]&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; System.DateTime OrderDate { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        [ScaffoldColumn(&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;)]&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; Username { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        [Required(ErrorMessage = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;First Name is required&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)]&lt;br /&gt;        [DisplayName(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;First Name&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)]&lt;br /&gt;        [StringLength(&lt;span style="color: #800080;"&gt;160&lt;/span&gt;)]&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; FirstName { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        [Required(ErrorMessage = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Last Name is required&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)]&lt;br /&gt;        [DisplayName(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Last Name&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)]&lt;br /&gt;        [StringLength(&lt;span style="color: #800080;"&gt;160&lt;/span&gt;)]&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; LastName { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        [Required(ErrorMessage = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Address is required&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)]&lt;br /&gt;        [StringLength(&lt;span style="color: #800080;"&gt;70&lt;/span&gt;)]&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; Address { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        [Required(ErrorMessage = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;City is required&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)]&lt;br /&gt;        [StringLength(&lt;span style="color: #800080;"&gt;40&lt;/span&gt;)]&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; City { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        [Required(ErrorMessage = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;State is required&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)]&lt;br /&gt;        [StringLength(&lt;span style="color: #800080;"&gt;40&lt;/span&gt;)]&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; State { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        [Required(ErrorMessage = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Postal Code is required&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)]&lt;br /&gt;        [DisplayName(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Postal Code&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)]&lt;br /&gt;        [StringLength(&lt;span style="color: #800080;"&gt;10&lt;/span&gt;)]&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; PostalCode { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        [Required(ErrorMessage = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Country is required&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)]&lt;br /&gt;        [StringLength(&lt;span style="color: #800080;"&gt;40&lt;/span&gt;)]&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; Country { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        [Required(ErrorMessage = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Phone is required&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)]&lt;br /&gt;        [StringLength(&lt;span style="color: #800080;"&gt;24&lt;/span&gt;)]&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; Phone { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        [Required(ErrorMessage = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Email Address is required&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)]&lt;br /&gt;        [DisplayName(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Email Address&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)]&lt;br /&gt;        [RegularExpression(&lt;span style="color: #800000;"&gt;@"&lt;/span&gt;&lt;span style="color: #800000;"&gt;[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&lt;br /&gt;        ErrorMessage = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Email is is not valid.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)]&lt;br /&gt;        [DataType(DataType.EmailAddress)]&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; Email { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        [ScaffoldColumn(&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;)]&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;decimal&lt;/span&gt; Total { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; List&amp;lt;OrderDetail&amp;gt; OrderDetails { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在没有提交必要的信息或者提交错误信息的时候，我们将会看到客户端的验证信息。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/13475/2011112000283842.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;现在，我们已经完成了结账中最困难的部分，还有一些小的工作要完成。我们增加两个简单的视图，还需要注意在登录过程中购物车信息。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;增加完成结账视图&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;完成结账的视图非常简单，仅仅需要显示订单的编号，在控制器中的 Complete 方法上点击右键，增加名为 Complete 的强类型 int 视图。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/13475/2011112000285913.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;现在，修改视图显示订单的编号。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;@model &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;br /&gt;@{&lt;br /&gt;    ViewBag.Title = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Checkout Complete&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;; &lt;br /&gt;}&lt;br /&gt;&amp;lt;h2&amp;gt;&lt;br /&gt;    Checkout Complete&amp;lt;/h2&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;&lt;br /&gt;    Thanks &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; your order! Your order number &lt;span style="color: #0000ff;"&gt;is&lt;/span&gt;: @Model&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;&lt;br /&gt;    How about shopping &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; some more music &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; our @Html.ActionLink(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;store&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Index&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Home&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)&lt;br /&gt;&amp;lt;/p&amp;gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;更新错误视图&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;项目的默认模板中，包含了定义在 /Shared Views 文件夹中的错误页面，可以在整个站点中使用。这个页面仅仅包含简单的信息，也没有使用我们的布局，我们更新一下。&lt;/p&gt;&#xD;
&lt;p&gt;由于这是通用的错误页面，内容非常简单，我们仅仅包含一个提示信息，和用来重做工作的导航到上一个页面的链接。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;@{ ViewBag.Title = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Error&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;; }&lt;br /&gt;&amp;lt;h2&amp;gt;&lt;br /&gt;    Error&amp;lt;/h2&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;&lt;br /&gt;    We&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;re sorry, we&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;ve hit an unexpected error. &amp;lt;a href=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;javascript:history.go(-1)&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt;Click&lt;br /&gt;        here&amp;lt;/a&amp;gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; you&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;d like to go back and try that again.&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/haogj/aggbug/2255675.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/haogj/archive/2011/11/20/2255675.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/haogj/archive/2011/11/20/2255848.html</id><title type="text">使用 NHibernate 的示例查询</title><summary type="text">示例查询最多的应用场合是组合查询，我们常常需要在界面上提供若干的查询选项，然后根据用户的输入返回符合条件的结果。使用代码直接进行处理往往需要涉及到复杂的条件，由于组合条件并不确定，导致逻辑判断语句结构复杂。对于多个可选的参数，情况会变得更加严重。使用示例查询可以很方便地处理这种问题。在查询的时候，将收集到的查询条件赋予一个对象的属性，当然，这个对象的类型就是需要查询的实体对象。例如，在 NHibernate 中存在一个 User 的类型，我们需要对它的姓名和口令进行组合查询，User 的定义如下：namespace Demo.Dao.Domain{ // 用户对象 public c...</summary><published>2011-11-20T03:54:00Z</published><updated>2011-11-20T03:54:00Z</updated><author><name>冠军</name><uri>http://www.cnblogs.com/haogj/</uri></author><link rel="alternate" href="http://www.cnblogs.com/haogj/archive/2011/11/20/2255848.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/haogj/archive/2011/11/20/2255848.html"/><content type="html">&lt;p&gt;示例查询最多的应用场合是组合查询，我们常常需要在界面上提供若干的查询选项，然后根据用户的输入返回符合条件的结果。&lt;/p&gt;&#xD;
&lt;p&gt;使用代码直接进行处理往往需要涉及到复杂的条件，由于组合条件并不确定，导致逻辑判断语句结构复杂。对于多个可选的参数，情况会变得更加严重。&lt;/p&gt;&#xD;
&lt;p&gt;使用示例查询可以很方便地处理这种问题。&lt;/p&gt;&#xD;
&lt;p&gt;在查询的时候，将收集到的查询条件赋予一个对象的属性，当然，这个对象的类型就是需要查询的实体对象。&lt;/p&gt;&#xD;
&lt;p&gt;例如，在 NHibernate 中存在一个 User 的类型，我们需要对它的姓名和口令进行组合查询，User 的定义如下：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt; Demo.Dao.Domain&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 用户对象&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; User&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; UserId { &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; Username { &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; Password { &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt; Address Address { &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;在界面中，我们提供用户输入的输入框。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;label &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;for&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="&amp;lt;%= this.tbxName %&amp;gt;"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        用户名：&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;label&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;asp:TextBox &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;ID&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="tbxName"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; runat&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="server"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;asp:TextBox&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;label &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;for&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="&amp;lt;%= this.tbxPassword %&amp;gt;"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        口令：&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;label&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;asp:TextBox &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;ID&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="tbxPassword"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; runat&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="server"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;asp:TextBox&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;asp:Button &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;ID&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="btnSearch"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; runat&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="server"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; Text&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="查询"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; OnClick&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="btnSearch_Click"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;在按钮的点击事件中，我们将用户的输入组合为一个示例对象。然后提交给 NHibernate 进行查询。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; btnSearch_Click(&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.IsValid)&lt;br /&gt;    {&lt;br /&gt;        Demo.Dao.Domain.User example&lt;br /&gt;            = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Demo.Dao.Domain.User()&lt;br /&gt;                {&lt;br /&gt;                    Username = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.tbxName.Text,&lt;br /&gt;                    Password = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.tbxPassword.Text&lt;br /&gt;                };&lt;br /&gt;        IList&amp;lt;Demo.Dao.Domain.User&amp;gt; list = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.UserService.GetUsers(example);&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.Repeater1.DataSource = list;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.Repeater1.DataBind();&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;在后台的服务中，我们使用示例查询进行处理。&lt;/p&gt;&#xD;
&lt;p&gt;示例查询类型定义在命名空间 NHibernate.Criterion 中，使用静态方法 Create 可以创建示例对象。&lt;/p&gt;&#xD;
&lt;p&gt;首先创建一个查询条件对象，然后使用 Example 的 Create 方法创建出查询示例对象。最后就是实际的查询。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; IList&amp;lt;Demo.Dao.Domain.User&amp;gt; GetUsers( Demo.Dao.Domain.User exampleUser)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 创建查询标准&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: #0000ff;"&gt;global&lt;/span&gt;::NHibernate.ICriteria criteria&lt;br /&gt;        = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.Session.CreateCriteria&amp;lt;Demo.Dao.Domain.User&amp;gt;();&lt;br /&gt;            &lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 创建查询示例&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: #0000ff;"&gt;global&lt;/span&gt;::NHibernate.Criterion.Example example&lt;br /&gt;        = &lt;span style="color: #0000ff;"&gt;global&lt;/span&gt;::NHibernate.Criterion.Example.Create(exampleUser);&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 设置使用示例对象的查询条件&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    criteria.Add(example);&lt;br /&gt;&lt;br /&gt;    example.EnableLike(&lt;span style="color: #0000ff;"&gt;global&lt;/span&gt;::NHibernate.Criterion.MatchMode.Anywhere);&lt;br /&gt;&lt;br /&gt;    IList&amp;lt; Demo.Dao.Domain.User&amp;gt; list = criteria.List&amp;lt;Demo.Dao.Domain.User&amp;gt;();&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; list;&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;对于字符串类型的条件来说，默认使用精确匹配，但是，可以通过示例的 EnableLike 进行设置。NHibernate.Criterion.MatchMode 是一个枚举，支持下面的匹配模式。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 默认字符串是完全匹配，可以通过 EnableLike 进行设置&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Anywhere 表示任何位置匹配&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; End 出现在最后位置&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Start 出现在起始位置&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Exact 完全匹配，默认设置&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;example.EnableLike(&lt;span style="color: #0000ff;"&gt;global&lt;/span&gt;::NHibernate.Criterion.MatchMode.Anywhere);&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;当在姓名的输入框中输入 a 的时候，NHibernate 生成的 SQL 语句如下：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;SELECT&lt;/span&gt; this_.UserId &lt;span style="color: #0000ff;"&gt;as&lt;/span&gt; UserId0_0_, this_.Username &lt;span style="color: #0000ff;"&gt;as&lt;/span&gt; Username0_0_, this_.Password &lt;span style="color: #0000ff;"&gt;as&lt;/span&gt; Password0_0_, this_.AddressId &lt;span style="color: #0000ff;"&gt;as&lt;/span&gt; AddressId0_0_ &lt;span style="color: #0000ff;"&gt;&lt;br /&gt;FROM&lt;/span&gt; tbl_Users this_ &lt;span style="color: #0000ff;"&gt;&lt;br /&gt;WHERE&lt;/span&gt; (this_.Username &lt;span style="color: #808080;"&gt;like&lt;/span&gt; &lt;span style="color: #008000;"&gt;@p0&lt;/span&gt;)&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;除了强大的 EnableLike 之外，还提供了几个设置参数，比较常用的有 &lt;strong&gt;ExcludeZeroes&lt;/strong&gt;() 方法，它可以排除属性中值为 0 的属性。&lt;/div&gt;&#xD;
&lt;div&gt;比如，在 User 中增加一个 Age 的整数类型属性，还导致查询语句变成下面的 SQL&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;SELECT&lt;/span&gt; this_.UserId &lt;span style="color: #0000ff;"&gt;as&lt;/span&gt; UserId0_0_, this_.Username &lt;span style="color: #0000ff;"&gt;as&lt;/span&gt; Username0_0_, this_.Password &lt;span style="color: #0000ff;"&gt;as&lt;/span&gt; Password0_0_, &lt;br /&gt;&lt;br /&gt;this_.Age &lt;span style="color: #0000ff;"&gt;as&lt;/span&gt; Age0_0_, this_.AddressId &lt;span style="color: #0000ff;"&gt;as&lt;/span&gt; AddressId0_0_ &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;FROM&lt;/span&gt; tbl_Users this_ &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;WHERE&lt;/span&gt; (this_.Username &lt;span style="color: #808080;"&gt;like&lt;/span&gt; &lt;span style="color: #008000;"&gt;@p0&lt;/span&gt; &lt;span style="color: #808080;"&gt;and&lt;/span&gt; this_.Age &lt;span style="color: #808080;"&gt;=&lt;/span&gt; &lt;span style="color: #008000;"&gt;@p1&lt;/span&gt;)&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;br /&gt;使用排除 0 的设置&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 排除值为 0 的属性&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;example.ExcludeZeroes();&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div&gt;现在的 SQL 又成为&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;SELECT&lt;/span&gt; this_.UserId &lt;span style="color: #0000ff;"&gt;as&lt;/span&gt; UserId0_0_, this_.Username &lt;span style="color: #0000ff;"&gt;as&lt;/span&gt; Username0_0_, this_.Password &lt;span style="color: #0000ff;"&gt;as&lt;/span&gt; Password0_0_, &lt;br /&gt;&lt;br /&gt;this_.Age &lt;span style="color: #0000ff;"&gt;as&lt;/span&gt; Age0_0_, this_.AddressId &lt;span style="color: #0000ff;"&gt;as&lt;/span&gt; AddressId0_0_ &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;FROM&lt;/span&gt; tbl_Users this_ &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;WHERE&lt;/span&gt; (this_.Username &lt;span style="color: #808080;"&gt;like&lt;/span&gt; &lt;span style="color: #008000;"&gt;@p0&lt;/span&gt;)&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div&gt;不过，还有两个设置就要小心了。&lt;/div&gt;&#xD;
&lt;div&gt;ExcludeNulls() 方法，看起来是排除值为 null 的属性，不过，代码中是先调用了 ToString() 方法，然后再看字符串的长度，所以会使得前面的 ExcludeZeroes() 失效。&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;SELECT&lt;/span&gt; this_.UserId &lt;span style="color: #0000ff;"&gt;as&lt;/span&gt; UserId0_0_, this_.Username &lt;span style="color: #0000ff;"&gt;as&lt;/span&gt; Username0_0_, this_.Password &lt;span style="color: #0000ff;"&gt;as&lt;/span&gt; Password0_0_, &lt;br /&gt;&lt;br /&gt;this_.Age &lt;span style="color: #0000ff;"&gt;as&lt;/span&gt; Age0_0_, this_.AddressId &lt;span style="color: #0000ff;"&gt;as&lt;/span&gt; AddressId0_0_ &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;FROM&lt;/span&gt; tbl_Users this_ &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;WHERE&lt;/span&gt; (this_.Username &lt;span style="color: #808080;"&gt;like&lt;/span&gt; &lt;span style="color: #008000;"&gt;@p0&lt;/span&gt; &lt;span style="color: #808080;"&gt;and&lt;/span&gt; this_.Age &lt;span style="color: #808080;"&gt;=&lt;/span&gt; &lt;span style="color: #008000;"&gt;@p1&lt;/span&gt;)&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div&gt;ExcludeNone() 方法，表示需要使用示例对象的所有属性，也会使得 ExcludeZeroes() 失效。&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;SELECT&lt;/span&gt; this_.UserId &lt;span style="color: #0000ff;"&gt;as&lt;/span&gt; UserId0_0_, this_.Username &lt;span style="color: #0000ff;"&gt;as&lt;/span&gt; Username0_0_, this_.Password &lt;span style="color: #0000ff;"&gt;as&lt;/span&gt; Password0_0_, &lt;br /&gt;&lt;br /&gt;this_.Age &lt;span style="color: #0000ff;"&gt;as&lt;/span&gt; Age0_0_, this_.AddressId &lt;span style="color: #0000ff;"&gt;as&lt;/span&gt; AddressId0_0_ &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;FROM&lt;/span&gt; tbl_Users this_ &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;WHERE&lt;/span&gt; (this_.Username &lt;span style="color: #808080;"&gt;like&lt;/span&gt; &lt;span style="color: #008000;"&gt;@p0&lt;/span&gt; &lt;span style="color: #808080;"&gt;and&lt;/span&gt; this_.Password &lt;span style="color: #0000ff;"&gt;is&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt; &lt;span style="color: #808080;"&gt;and&lt;/span&gt; this_.Age &lt;span style="color: #808080;"&gt;=&lt;/span&gt; &lt;span style="color: #008000;"&gt;@p1&lt;/span&gt;)&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;br /&gt;最后，还有一个 IgnoreCase() 方法， 使用不区分大小写的方法比较字符串，对于 Oracle 是有效的，对于 SQL Server 就用不到了。&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;SELECT&lt;/span&gt; this_.UserId &lt;span style="color: #0000ff;"&gt;as&lt;/span&gt; UserId0_0_, this_.Username &lt;span style="color: #0000ff;"&gt;as&lt;/span&gt; Username0_0_, this_.Password &lt;span style="color: #0000ff;"&gt;as&lt;/span&gt; Password0_0_, &lt;br /&gt;&lt;br /&gt;this_.Age &lt;span style="color: #0000ff;"&gt;as&lt;/span&gt; Age0_0_, this_.AddressId &lt;span style="color: #0000ff;"&gt;as&lt;/span&gt; AddressId0_0_ &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;FROM&lt;/span&gt; tbl_Users this_ &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;WHERE&lt;/span&gt; (&lt;span style="color: #ff00ff;"&gt;lower&lt;/span&gt;(this_.Username) &lt;span style="color: #808080;"&gt;like&lt;/span&gt; &lt;span style="color: #ff00ff;"&gt;lower&lt;/span&gt;(&lt;span style="color: #008000;"&gt;@p0&lt;/span&gt;) &lt;span style="color: #808080;"&gt;and&lt;/span&gt; this_.Age &lt;span style="color: #808080;"&gt;=&lt;/span&gt; &lt;span style="color: #008000;"&gt;@p1&lt;/span&gt;)&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&lt;img src="http://www.cnblogs.com/haogj/aggbug/2255848.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/haogj/archive/2011/11/20/2255848.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/haogj/archive/2011/11/20/2255515.html</id><title type="text">ASP.NET MVC 音乐商店 - 8. 使用 Ajax 更新的购物车</title><summary type="text">在这个项目中，我们将允许用户在没有注册登录的情况下将专辑加入购物车，但是，在完成结账的时候必须完成注册工作。购物和结账将会被分离到两个控制器中：一个 ShoppingCart 控制器，允许匿名用户使用购物车，另一个 Checkout 控制器处理结账。我们先从购物车的控制器开始，然后在下一部分来处理结帐。加入购物车，订单和订单明细的模型类在购物车和结账的处理中将会使用到一些新的类，在 Models 文件夹上右键，然后使用下面的代码增加一个新的类 Cart.using System.ComponentModel.DataAnnotations;namespace MvcMusicStore.Mod</summary><published>2011-11-19T16:10:00Z</published><updated>2011-11-19T16:10:00Z</updated><author><name>冠军</name><uri>http://www.cnblogs.com/haogj/</uri></author><link rel="alternate" href="http://www.cnblogs.com/haogj/archive/2011/11/20/2255515.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/haogj/archive/2011/11/20/2255515.html"/><content type="html">&lt;p&gt;在这个项目中，我们将允许用户在没有注册登录的情况下将专辑加入购物车，但是，在完成结账的时候必须完成注册工作。购物和结账将会被分离到两个控制器中：一个 ShoppingCart 控制器，允许匿名用户使用购物车，另一个 Checkout 控制器处理结账。我们先从购物车的控制器开始，然后在下一部分来处理结帐。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;加入购物车，订单和订单明细的模型类&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在购物车和结账的处理中将会使用到一些新的类，在 Models 文件夹上右键，然后使用下面的代码增加一个新的类 Cart.&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System.ComponentModel.DataAnnotations;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt; MvcMusicStore.Models&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; Cart&lt;br /&gt;    {&lt;br /&gt;        [Key]&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; RecordId { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; CartId { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; AlbumId { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; Count { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; System.DateTime DateCreated { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt; Album Album { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p align="left"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这个类非常类似我们前面使用的类，除了 RecordId 属性上的[Key] 标注之外。我们的购物车拥有一个字符串类型的名为 CartId 的标识，用来允许匿名用户使用购物车，但是,CartId 并不是表的主键，表的主键是整数类型的名为 RecordId的字段，根据约定，EF CodeFirst 将会认为表的主键名为 CartId 或者 Id，不过，如果需要的话，我们可以很容易地通过标注或者代码来重写这个规则。这里例子演示了在使用 EF CodeFirst 的时候。当我们的表不是约定的样子时，我们也不必被约定所局限。&lt;/p&gt;&#xD;
&lt;p&gt;下一步，使用下面的代码增加订单 Order 类。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt; MvcMusicStore.Models&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;partial&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; Order&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; OrderId { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; Username { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; FirstName { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; LastName { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; Address { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; City { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; State { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; PostalCode { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; Country { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; Phone { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; Email { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;decimal&lt;/span&gt; Total { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; System.DateTime OrderDate { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; List&amp;lt;OrderDetail&amp;gt; OrderDetails { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这个类跟踪订单的汇总和发货信息，它的结构也不复杂，订单依赖我们这里还没有定义的一个类，通过 OrderDetails 属性来表示订单的明细。我们来定义一下这个 OrderDetail 类。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt; MvcMusicStore.Models&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; OrderDetail&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; OrderDetailId { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; OrderId { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; AlbumId { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; Quantity { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;decimal&lt;/span&gt; UnitPrice { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt; Album Album { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt; Order Order { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;把我们的 MusicStoreEntities 更新一下，以便包含我们新定义的模型类，包括艺术家 Artist，更新之后的 MusicStoreEntities 如下所示。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System.Data.Entity;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt; MvcMusicStore.Models&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; MusicStoreEntities : DbContext&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; DbSet&amp;lt;Album&amp;gt; Albums { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; DbSet&amp;lt;Genre&amp;gt; Genres { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; } &lt;br /&gt;        &lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; DbSet&amp;lt;Artist&amp;gt; Artists { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; } &lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; DbSet&amp;lt;Cart&amp;gt; Carts { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; } &lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; DbSet&amp;lt;Order&amp;gt; Orders { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; } &lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; DbSet&amp;lt;OrderDetail&amp;gt; OrderDetails { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;管理购物车业务逻辑&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;下一步，我们在 Models 文件夹中创建 ShoppingCart 类，ShoppingCart 模型类处理&amp;nbsp; Cart 表的数据访问，另外，它还需要处理在购物车中增加或者删除项目的业务逻辑。&lt;/p&gt;&#xD;
&lt;p&gt;因为我们并不希望用户必须登录系统才可以使用购物车，对于没有登录的用户，我们需要为他们创建一个临时的唯一标识，这里使用 GUID，或者被称为全局唯一标识符，对于已经登录的用户，我们直接使用他们的名称，这个表示我们保存在 Session 中。&lt;/p&gt;&#xD;
&lt;p&gt;注意：Session 会话可以很方便地存储用户的信息，在用户离开站点之后，这些信息将会过期，滥用 Session 信息会对大型站点产生影响，我们这里使用 Session 达到演示目的。&lt;/p&gt;&#xD;
&lt;p&gt;ShoppingCart 类提供了如下的方法：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;AddToCart&lt;/strong&gt;, 将专辑作为参数加入到购物车中，在 Cart 表中跟踪每个专辑的数量，在这个方法中，我们将会检查是在表中增加一个新行，还是仅仅在用户已经选择的专辑上增加数量。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;RemoveFromCart&lt;/strong&gt;，通过专辑的标识从用户的购物车中将这个专辑的数量减少 1，如果用户仅仅剩下一个，那么就删除这一行。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;EmptyCart&lt;/strong&gt;，删除用户购物车中所有的项目。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;GetCartItems&lt;/strong&gt;，获取购物项目的列表用来显示或者处理。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;GetCount&lt;/strong&gt;，获取用户购物车中专辑的数量&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;GetTotal&lt;/strong&gt;，获取购物车中商品的总价&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;CreateOrder&lt;/strong&gt;，将购物车转换为结账处理过程中的订单。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;GetCart&lt;/strong&gt; ，这是一个静态方法，用来获取当前用户的购物车对象，它使用 GetCartId 方法来读取保存当前 Session 中的购物车标识，GetCartId 方法需要 HttpContextBase 以便获取当前的 Session。&lt;/p&gt;&#xD;
&lt;p&gt;实际的代码如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt; MvcMusicStore.Models&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;partial&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; ShoppingCart&lt;br /&gt;    {&lt;br /&gt;        MusicStoreEntities storeDB = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; MusicStoreEntities();&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; ShoppingCartId { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; CartSessionKey = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;CartId&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; ShoppingCart GetCart(HttpContextBase context)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; cart = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; ShoppingCart();&lt;br /&gt;            cart.ShoppingCartId = cart.GetCartId(context);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; cart;&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Helper method to simplify shopping cart calls&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; ShoppingCart GetCart(Controller controller)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; GetCart(controller.HttpContext);&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; AddToCart(Album album)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Get the matching cart and album instances&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; cartItem = storeDB.Carts.SingleOrDefault(&lt;br /&gt;            c =&amp;gt; c.CartId == ShoppingCartId&lt;br /&gt;            &amp;amp;&amp;amp; c.AlbumId == album.AlbumId);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (cartItem == &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;)&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Create a new cart item if no cart item exists&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                cartItem = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Cart&lt;br /&gt;                {&lt;br /&gt;                    AlbumId = album.AlbumId,&lt;br /&gt;                    CartId = ShoppingCartId,&lt;br /&gt;                    Count = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;,&lt;br /&gt;                    DateCreated = DateTime.Now&lt;br /&gt;                };&lt;br /&gt;                storeDB.Carts.Add(cartItem);&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; If the item does exist in the cart, then add one to the quantity&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                cartItem.Count++;&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Save changes&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            storeDB.SaveChanges();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; RemoveFromCart(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; id)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Get the cart&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; cartItem = storeDB.Carts.Single(&lt;br /&gt;            cart =&amp;gt; cart.CartId == ShoppingCartId&lt;br /&gt;            &amp;amp;&amp;amp; cart.RecordId == id);&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; itemCount = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (cartItem != &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;)&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (cartItem.Count &amp;gt; &lt;span style="color: #800080;"&gt;1&lt;/span&gt;)&lt;br /&gt;                {&lt;br /&gt;                    cartItem.Count--;&lt;br /&gt;                    itemCount = cartItem.Count;&lt;br /&gt;                }&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;                {&lt;br /&gt;                    storeDB.Carts.Remove(cartItem);&lt;br /&gt;                }&lt;br /&gt;                &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Save changes&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                storeDB.SaveChanges();&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; itemCount;&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; EmptyCart()&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; cartItems = storeDB.Carts.Where(cart =&amp;gt; cart.CartId == ShoppingCartId);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; cartItem &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; cartItems)&lt;br /&gt;            {&lt;br /&gt;                storeDB.Carts.Remove(cartItem);&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Save changes&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            storeDB.SaveChanges();&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; List&amp;lt;Cart&amp;gt; GetCartItems()&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; storeDB.Carts.Where(cart =&amp;gt; cart.CartId == ShoppingCartId).ToList();&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; GetCount()&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Get the count of each item in the cart and sum them up&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;? count = (&lt;span style="color: #0000ff;"&gt;from&lt;/span&gt; cartItems &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; storeDB.Carts&lt;br /&gt;                          &lt;span style="color: #0000ff;"&gt;where&lt;/span&gt; cartItems.CartId == ShoppingCartId&lt;br /&gt;                          &lt;span style="color: #0000ff;"&gt;select&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;?)cartItems.Count).Sum();&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Return 0 if all entries are null&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; count ?? &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;decimal&lt;/span&gt; GetTotal()&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Multiply album price by count of that album to get&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; the current price for each of those albums in the cart&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; sum all album price totals to get the cart total&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;decimal&lt;/span&gt;? total = (&lt;span style="color: #0000ff;"&gt;from&lt;/span&gt; cartItems &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; storeDB.Carts&lt;br /&gt;                              &lt;span style="color: #0000ff;"&gt;where&lt;/span&gt; cartItems.CartId == ShoppingCartId&lt;br /&gt;                              &lt;span style="color: #0000ff;"&gt;select&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;?)cartItems.Count * cartItems.Album.Price).Sum();&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; total ?? &lt;span style="color: #0000ff;"&gt;decimal&lt;/span&gt;.Zero;&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; CreateOrder(Order order)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;decimal&lt;/span&gt; orderTotal = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; cartItems = GetCartItems();&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Iterate over the items in the cart, adding the order details for each&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; item &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; cartItems)&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; orderDetail = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; OrderDetail&lt;br /&gt;                {&lt;br /&gt;                    AlbumId = item.AlbumId,&lt;br /&gt;                    OrderId = order.OrderId,&lt;br /&gt;                    UnitPrice = item.Album.Price,&lt;br /&gt;                    Quantity = item.Count&lt;br /&gt;                };&lt;br /&gt;                &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Set the order total of the shopping cart&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                orderTotal += (item.Count * item.Album.Price);&lt;br /&gt;                storeDB.OrderDetails.Add(orderDetail);&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Set the order's total to the orderTotal count&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            order.Total = orderTotal;&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Save the order&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            storeDB.SaveChanges();&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Empty the shopping cart&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            EmptyCart();&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Return the OrderId as the confirmation number&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; order.OrderId;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; We're using HttpContextBase to allow access to cookies.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; GetCartId(HttpContextBase context)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (context.Session[CartSessionKey] == &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;)&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.IsNullOrWhiteSpace(context.User.Identity.Name))&lt;br /&gt;                {&lt;br /&gt;                    context.Session[CartSessionKey] = context.User.Identity.Name;&lt;br /&gt;                }&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;                {&lt;br /&gt;                    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Generate a new random GUID using System.Guid class&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;                    Guid tempCartId = Guid.NewGuid();&lt;br /&gt;                    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Send tempCartId back to client as a cookie&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                    context.Session[CartSessionKey] = tempCartId.ToString();&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; context.Session[CartSessionKey].ToString();&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; When a user has logged in, migrate their shopping cart to&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; be associated with their username&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; MigrateCart(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; userName)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; shoppingCart = storeDB.Carts.Where(c =&amp;gt; c.CartId == ShoppingCartId);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt; (Cart item &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; shoppingCart)&lt;br /&gt;            {&lt;br /&gt;                item.CartId = userName;&lt;br /&gt;            }&lt;br /&gt;            storeDB.SaveChanges();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;视图模型&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;我们的 ShoppingCart 控制器需要向视图传递复杂的信息，这些信息与现有的模型并不完全匹配，我们不希望修改模型来适应视图的需要；模型类应该表示领域信息，而不是用户界面。一个解决方案是使用 ViewBag 来向视图传递信息，就像我们在 Store Manager 中的下列列表处理中那样，但是通过 ViewBag 来传递大量信息就不好管理了。&lt;/p&gt;&#xD;
&lt;p&gt;另外一个解决方案是使用视图模型模式，使用这个模式，我们需要创建强类型的用于视图场景的类来表示信息，这个类拥有视图所需要的值或者内容。我们的控制器填充信息，然后传递这种类的对象供视图使用，这样就可以得到强类型的、编译时检查支持，并且在视图模板中带有智能提示。&lt;/p&gt;&#xD;
&lt;p&gt;我们将会创建两个视图模型用于我们的 ShoppingCart 控制器：ShoppingCartViewModel 将会用于用户的购物车，而 ShoppingCartRemoveViewModel 会用于在购物车中删除内容时的确认提示信息。&lt;/p&gt;&#xD;
&lt;p&gt;首先在项目中创建 ViewModels 文件夹来组织我们的项目文件，在项目上点击鼠标的右键，然后选择添加 &amp;ndash;〉新文件夹。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/13475/2011111923551920.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;命名为 ViewModels&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/13475/2011111923555948.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;下一步，在 ViewModels 文件夹中增加 ShoppingCartViewModel 类，它包括两个属性，一个 CartItem 的列表，另外一个属性是购物中的总价。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; MvcMusicStore.Models;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt; MvcMusicStore.ViewModels&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; ShoppingCartViewModel&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; List&amp;lt;Cart&amp;gt; CartItems { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;decimal&lt;/span&gt; CartTotal { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;然后，增加 ShoppingCartRemoveViewModel 类，它包括五个属性。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt; MvcMusicStore.ViewModels&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; ShoppingCartRemoveViewModel&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; Message { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;decimal&lt;/span&gt; CartTotal { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; CartCount { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; ItemCount { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; DeleteId { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Shopping Cart 控制器&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Shopping Cart 控制器有三个主要的目的：增加项目到购物车，从购物车中删除项目，查看购物车中的项目。控制器使用到我们刚刚创建的三个类：ShoppingCartViewModel，ShoppingCartRemoveViewModel 和 ShoppingCart，像 StoreController 和 StoreManagerController 一样，我们在控制器中增加一个 MusicStoreEntities 字段来操作数据。&lt;/p&gt;&#xD;
&lt;p&gt;在项目中使用空的控制器模板创建 Shopping Cart 控制器&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/13475/2011111923584063.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;下面是已经完成的控制器代码，Index 和 Add 方法看起来非常熟悉。Remove 和 CartSummary 这两个 Action 方法处理两种特定的场景，我们将在后面讨论。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; MvcMusicStore.Models;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; MvcMusicStore.ViewModels;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt; MvcMusicStore.Controllers&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; ShoppingCartController : Controller&lt;br /&gt;    {&lt;br /&gt;        MusicStoreEntities storeDB = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; MusicStoreEntities();&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; GET: /ShoppingCart/&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ActionResult Index()&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; cart = ShoppingCart.GetCart(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.HttpContext);&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Set up our ViewModel&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; viewModel = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; ShoppingCartViewModel&lt;br /&gt;            {&lt;br /&gt;                CartItems = cart.GetCartItems(),&lt;br /&gt;                CartTotal = cart.GetTotal()&lt;br /&gt;            };&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Return the view&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; View(viewModel);&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; GET: /Store/AddToCart/5&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ActionResult AddToCart(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; id)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Retrieve the album from the database&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; addedAlbum = storeDB.Albums&lt;br /&gt;            .Single(album =&amp;gt; album.AlbumId == id);&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Add it to the shopping cart&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; cart = ShoppingCart.GetCart(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.HttpContext);&lt;br /&gt;            cart.AddToCart(addedAlbum);&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Go back to the main store page for more shopping&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; RedirectToAction(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Index&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; AJAX: /ShoppingCart/RemoveFromCart/5&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        [HttpPost]&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ActionResult RemoveFromCart(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; id)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Remove the item from the cart&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; cart = ShoppingCart.GetCart(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.HttpContext);&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Get the name of the album to display confirmation&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; albumName = storeDB.Carts&lt;br /&gt;            .Single(item =&amp;gt; item.RecordId == id).Album.Title;&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Remove from cart&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; itemCount = cart.RemoveFromCart(id);&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Display the confirmation message&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; results = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; ShoppingCartRemoveViewModel&lt;br /&gt;            {&lt;br /&gt;                Message = Server.HtmlEncode(albumName) +&lt;br /&gt;                &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt; has been removed from your shopping cart.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&lt;br /&gt;                CartTotal = cart.GetTotal(),&lt;br /&gt;                CartCount = cart.GetCount(),&lt;br /&gt;                ItemCount = itemCount,&lt;br /&gt;                DeleteId = id&lt;br /&gt;            };&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; Json(results);&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; GET: /ShoppingCart/CartSummary&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        [ChildActionOnly]&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ActionResult CartSummary()&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; cart = ShoppingCart.GetCart(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.HttpContext);&lt;br /&gt;            ViewData[&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;CartCount&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;] = cart.GetCount();&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; PartialView(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;CartSummary&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;使用 jQuery 进行 Ajax 更新&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;下面我们将创建 Shopping Cart 的 Index Action 视图，这个视图使用强类型的 ShoppingCartViewModel ，像以前的视图一样，使用 List 视图模板。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/13475/2011112000000141.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在这里，我们不使用 Html.ActionLink 从购物车中删除项目，我们将会使用 JQuery 来包装客户端使用 RemoveLink 的类所有超级链接元素的事件，不是提交表单，而是通过客户端的事件向 RemoveFromCart 控制器方法发出 Ajax 请求，然后 RemoveFromCart 返回 JSON 格式的结果，这个结果被发送到我们在 AjaxOptions 的 OnSucess 参数中创建的 JavaScript 函数，在这里是 handleUpdate，handleUpdate 函数解析 JSON 格式的结果，然后通过 jQuery 执行下面的四个更新。&lt;/p&gt;&#xD;
&lt;ol&gt;&#xD;
&lt;li&gt;从列表中删除专辑&lt;/li&gt;&#xD;
&lt;li&gt;更新头部的购物车中的数量&lt;/li&gt;&#xD;
&lt;li&gt;向用户显示更新信息&lt;/li&gt;&#xD;
&lt;li&gt;更新购物车中的总价&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;p&gt;因为在 Index 视图中我们处理了删除的场景，我们就不再需要为 RemoveFromCart 方法增加额外的视图。下面是视图的完整代码。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;@model MvcMusicStore.ViewModels.ShoppingCartViewModel &lt;br /&gt;@{ &lt;br /&gt;    ViewBag.Title = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Shopping Cart&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;; &lt;br /&gt;}&lt;br /&gt;&amp;lt;script src=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;/Scripts/jquery-1.4.4.min.js&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; type=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;text/javascript&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script type=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;text/javascript&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt;&lt;br /&gt;    $(function () {&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Document.ready -&amp;gt; link up remove event handler&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        $(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;.RemoveLink&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;).click(function () {&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Get the id from the link&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; recordToDelete = $(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;).attr(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;data-id&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (recordToDelete != &lt;span style="color: #800000;"&gt;''&lt;/span&gt;) {&lt;br /&gt;                &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Perform the ajax post&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                $.post(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;/ShoppingCart/RemoveFromCart&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, { &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;id&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;: recordToDelete },&lt;br /&gt;function (data) {&lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Successful requests get here&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Update the page elements&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (data.ItemCount == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) {&lt;br /&gt;        $(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;#row-&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; + data.DeleteId).fadeOut(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;slow&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;);&lt;br /&gt;    } &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; {&lt;br /&gt;        $(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;#item-count-&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; + data.DeleteId).text(data.ItemCount);&lt;br /&gt;    }&lt;br /&gt;    $(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;#cart-total&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;).text(data.CartTotal);&lt;br /&gt;    $(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;#update-message&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;).text(data.Message);&lt;br /&gt;    $(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;#cart-status&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;).text(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;Cart (&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; + data.CartCount + &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;)&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;);&lt;br /&gt;});&lt;br /&gt;            }&lt;br /&gt;        });&lt;br /&gt;    });&lt;br /&gt;    function handleUpdate() {&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Load and deserialize the returned JSON data&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; json = context.get_data();&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; data = Sys.Serialization.JavaScriptSerializer.deserialize(json);&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Update the page elements&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (data.ItemCount == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) {&lt;br /&gt;            $(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;#row-&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; + data.DeleteId).fadeOut(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;slow&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;);&lt;br /&gt;        } &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; {&lt;br /&gt;            $(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;#item-count-&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; + data.DeleteId).text(data.ItemCount);&lt;br /&gt;        }&lt;br /&gt;        $(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;#cart-total&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;).text(data.CartTotal);&lt;br /&gt;        $(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;#update-message&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;).text(data.Message);&lt;br /&gt;        $(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;#cart-status&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;).text(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;Cart (&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; + data.CartCount + &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;)&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;h3&amp;gt;&lt;br /&gt;    &amp;lt;em&amp;gt;Review&amp;lt;/em&amp;gt; your cart:&lt;br /&gt;&amp;lt;/h3&amp;gt;&lt;br /&gt;&amp;lt;p &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;button&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt;&lt;br /&gt;    @Html.ActionLink(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Checkout &amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;AddressAndPayment&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Checkout&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)&lt;br /&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;div id=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;update-message&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;table&amp;gt;&lt;br /&gt;    &amp;lt;tr&amp;gt;&lt;br /&gt;        &amp;lt;th&amp;gt;&lt;br /&gt;            Album Name&lt;br /&gt;        &amp;lt;/th&amp;gt;&lt;br /&gt;        &amp;lt;th&amp;gt;&lt;br /&gt;            Price (each)&lt;br /&gt;        &amp;lt;/th&amp;gt;&lt;br /&gt;        &amp;lt;th&amp;gt;&lt;br /&gt;            Quantity&lt;br /&gt;        &amp;lt;/th&amp;gt;&lt;br /&gt;        &amp;lt;th&amp;gt;&lt;br /&gt;        &amp;lt;/th&amp;gt;&lt;br /&gt;    &amp;lt;/tr&amp;gt;&lt;br /&gt;    @foreach (&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; item &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; Model.CartItems)&lt;br /&gt;    { &amp;lt;tr id=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;row-@item.RecordId&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt;&lt;br /&gt;        &amp;lt;td&amp;gt;&lt;br /&gt;            @Html.ActionLink(item.Album.Title, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Details&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Store&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; { id = item.AlbumId }, &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;)&lt;br /&gt;        &amp;lt;/td&amp;gt;&lt;br /&gt;        &amp;lt;td&amp;gt;&lt;br /&gt;            @item.Album.Price&lt;br /&gt;        &amp;lt;/td&amp;gt;&lt;br /&gt;        &amp;lt;td id=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;item-count-@item.RecordId&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt;&lt;br /&gt;            @item.Count&lt;br /&gt;        &amp;lt;/td&amp;gt;&lt;br /&gt;        &amp;lt;td&amp;gt;&lt;br /&gt;            &amp;lt;a href=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;#&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;RemoveLink&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; data-id=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;@item.RecordId&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt;Remove &lt;span style="color: #0000ff;"&gt;from&lt;/span&gt; cart&amp;lt;/a&amp;gt;&lt;br /&gt;        &amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;/tr&amp;gt;&lt;br /&gt;    }&lt;br /&gt;    &amp;lt;tr&amp;gt;&lt;br /&gt;        &amp;lt;td&amp;gt;&lt;br /&gt;            Total&lt;br /&gt;        &amp;lt;/td&amp;gt;&lt;br /&gt;        &amp;lt;td&amp;gt;&lt;br /&gt;        &amp;lt;/td&amp;gt;&lt;br /&gt;        &amp;lt;td&amp;gt;&lt;br /&gt;        &amp;lt;/td&amp;gt;&lt;br /&gt;        &amp;lt;td id=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;cart-total&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt;&lt;br /&gt;            @Model.CartTotal&lt;br /&gt;        &amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;为了测试一下，我们需要向购物车中增加一些项目，更新 Store 的 Details 视图包含添加到购物车按钮，在这里，我们还需要包含我们后来增加的专辑的一些额外信息，流派，艺术家，价格等等。更新后的视图如下所示。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;@model MvcMusicStore.Models.Album&lt;br /&gt;@{&lt;br /&gt;    ViewBag.Title = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Album - &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + Model.Title; &lt;br /&gt;}&lt;br /&gt;&amp;lt;h2&amp;gt;@Model.Title&amp;lt;/h2&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;&lt;br /&gt;    &amp;lt;img alt=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;@Model.Title&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; src=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;@Model.AlbumArtUrl&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; /&amp;gt;&lt;br /&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;div id=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;album-details&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt;&lt;br /&gt;    &amp;lt;p&amp;gt;&lt;br /&gt;        &amp;lt;em&amp;gt;Genre:&amp;lt;/em&amp;gt; @Model.Genre.Name&lt;br /&gt;    &amp;lt;/p&amp;gt;&lt;br /&gt;    &amp;lt;p&amp;gt;&lt;br /&gt;        &amp;lt;em&amp;gt;Artist:&amp;lt;/em&amp;gt; @Model.Artist.Name&lt;br /&gt;    &amp;lt;/p&amp;gt;&lt;br /&gt;    &amp;lt;p&amp;gt;&lt;br /&gt;        &amp;lt;em&amp;gt;Price:&amp;lt;/em&amp;gt; @String.Format(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;{0:F}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, Model.Price)&lt;br /&gt;    &amp;lt;/p&amp;gt;&lt;br /&gt;    &amp;lt;p &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;button&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;gt;&lt;br /&gt;        @Html.ActionLink(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Add to cart&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;AddToCart&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;ShoppingCart&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; { id = Model.AlbumId }, &lt;span style="color: #800000;"&gt;""&lt;/span&gt;)&lt;br /&gt;    &amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;现在，我们可以在商店中通过购物车来购买和删除一些项目了。运行程序，浏览 Store 控制器的 Index 。&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/13475/2011112000031690.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;然后，点击某个分类来查看专辑的列表。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/13475/2011112000041359.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;点击某个专辑来显示专辑的详细内容，现在已经有了加入购物车的按钮。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/13475/2011112000044830.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;点击加入购物车之后，可以在购物车中看到。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/13475/2011112000053394.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在购物车中，可以点击从购物车中删除的链接，将会看到 Ajax 更新购物车的效果。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/13475/2011112000062086.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;现在的购物车允许没有注册的用户使用购物车添加项目，在下一部分，我们将允许匿名用户注册和完成结账的处理。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/haogj/aggbug/2255515.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/haogj/archive/2011/11/20/2255515.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
