<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_Rickie is back .... 人生·工作的结果=思维方式×热情×能力</title><subtitle type="text">今天比昨天更好，明天比今天更好，为此，不屈不挠地工作、勤勤恳恳地经营、孜孜不倦地修炼，我们人生的目的和价值就是这样确确实实地存在着。</subtitle><id>http://feed.cnblogs.com/blog/u/3280/rss</id><updated>2011-07-19T13:09:37Z</updated><author><name>Rickie</name><uri>http://www.cnblogs.com/rickie/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/rickie/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/3280/rss"/><entry><id>http://www.cnblogs.com/rickie/archive/2011/07/19/2111031.html</id><title type="text">Windows Server AppFabric 的相关技术文章</title><summary type="text">Windows Server AppFabric 扩展了 Windows Server 以为 Web 应用程序和中间层服务提供增强的托管、管理和缓存功能。 AppFabric 托管功能向 Internet 信息服务 (IIS)、Windows Process Activation Service (WAS) 和 .NET Framework 4 添加了服务管理扩展。其中包括托管服务和托管管理工具，这些工具使部署、配置和管理基于 Windows Communication Foundation (WCF) 和 Windows Workflow Foundation (WF) 的服务变得更加容易。</summary><published>2011-07-19T13:10:00Z</published><updated>2011-07-19T13:10:00Z</updated><author><name>Rickie</name><uri>http://www.cnblogs.com/rickie/</uri></author><link rel="alternate" href="http://www.cnblogs.com/rickie/archive/2011/07/19/2111031.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/rickie/archive/2011/07/19/2111031.html"/><content type="html">&#xD;
&lt;p&gt;Windows Server AppFabric 扩展了 Windows Server 以为 Web &#xD;
应用程序和中间层服务提供增强的托管、管理和缓存功能。 AppFabric 托管功能向 Internet 信息服务 (IIS)、Windows &#xD;
Process Activation Service (WAS) 和 .NET Framework 4 &#xD;
添加了服务管理扩展。其中包括托管服务和托管管理工具，这些工具使部署、配置和管理基于 Windows Communication &#xD;
Foundation (WCF) 和 Windows Workflow Foundation (WF) 的服务变得更加容易。&lt;/p&gt;&#xD;
&lt;p&gt;AppFabric&#xD;
 缓存功能向 Windows Server 添加了一个分布式的内存中对象缓存，它使扩展高性能 .NET 应用程序（特别是 ASP.NET &#xD;
应用程序）变得更加容易。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;关于Windows Server AppFabric 的相关技术文章：&lt;/p&gt;&#xD;
&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;a href="http://www.entlib.net/?p=375"&gt;Windows Server AppFabric 安装和配置&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="http://www.entlib.net/?p=435"&gt;Windows Server AppFabric 缓存物理和逻辑体系结构图&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="http://www.entlib.net/?p=444"&gt;Windows Server AppFabric 缓存管理、使用和部署&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="http://www.entlib.net/?p=383"&gt;Windows Server AppFabric在工作组(Workgroup)环境下的配置&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="http://www.entlib.net/?p=395"&gt;使用 Windows Server AppFabric 缓存编写 ASP.NET 应用程序&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="http://www.entlib.net/?p=452"&gt;AppFabric 性能监控和故障检测（Monitoring and Troubleshooting）&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="http://www.entlib.net/?p=458"&gt;AppFabric 配置托管服务（Configure Hosting Services）&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="http://www.microsoft.com/download/en/details.aspx?id=7956"&gt;Windows Server AppFabric Training Kit&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="http://www.entlib.net/?p=467" target="_blank"&gt;AppFabric IIS Manager 扩展、仪表板和对WCF服务的监控&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;img title="AppFabric_Logo" alt="" src="http://www.entlib.net/wp-content/uploads/2011/07/AppFabric_Logo1.png" width="300" height="93" /&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&lt;/ul&gt;&lt;img src="http://www.cnblogs.com/rickie/aggbug/2111031.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/rickie/archive/2011/07/19/2111031.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/rickie/archive/2011/07/09/2101653.html</id><title type="text">推荐关于大型网站架构设计的文章</title><summary type="text">关于大型网站的架构设计，包括hardware和software等等，经常有朋友谈及这个问题。这里推荐两篇非常好的文章，如何随着业务/访问量的增长，升级或扩展现有的系统架构设计。大型网站的服务器架构设计-1大型网站的服务器架构设计-2</summary><published>2011-07-09T02:35:00Z</published><updated>2011-07-09T02:35:00Z</updated><author><name>Rickie</name><uri>http://www.cnblogs.com/rickie/</uri></author><link rel="alternate" href="http://www.cnblogs.com/rickie/archive/2011/07/09/2101653.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/rickie/archive/2011/07/09/2101653.html"/><content type="html">&lt;p&gt;关于大型网站的架构设计，包括hardware和software等等，经常有朋友谈及这个问题。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;这里推荐两篇非常好的文章，如何随着业务/访问量的增长，升级或扩展现有的系统架构设计。&lt;/p&gt;&#xD;
&lt;h3 &gt;&lt;a href="http://www.entlib.net/?p=358" title="链向 大型网站的服务器架构设计-1 的固定链接" rel="bookmark"&gt;大型网站的服务器架构设计-1&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;h3 &gt;&lt;a href="http://www.entlib.net/?p=364" title="链向 大型网站的服务器架构设计-2 的固定链接" rel="bookmark"&gt;大型网站的服务器架构设计-2&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;=== 节选内容 ===&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;网站初始&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;架设入门网站其实很容易，在基本的架构是安装一台Web Server 及一台 Database Server，这样的架构在流量不高的个人网站而言，的确已足够了。但其实风险很高，因为没有考虑日后的扩充性（Scalability），也没有考虑到系统容错及恢复能力（High Availability &amp;amp; Failover），因此只要流量一高，问题就接踵而至。&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  title="IDC_Server_Architecture_1" src="http://www.entlib.net/wp-content/uploads/2011/07/IDC_Server_Architecture_1.png" width="600" height="827" /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/rickie/aggbug/2101653.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/rickie/archive/2011/07/09/2101653.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/rickie/archive/2011/05/16/2047305.html</id><title type="text">Project Silk – Mileage Stats 项目架构初步分析(ASP.NET MVC 3)</title><summary type="text">如果你正在学习ASP.NET MVC 3，HTML5，jQuery和浏览器客户端交互技术，推荐你下载Mileage Stats 范例程序，可更好理解如何使用当前技术创建当前的web应用程序，尤其关注如何架构一个企业级的应用程序。关于Mileage Stats项目的初步介绍，请参考《Project Silk – 基于ASP.NET MVC 3 的示例应用程序Mileage Stats》。</summary><published>2011-05-16T00:12:00Z</published><updated>2011-05-16T00:12:00Z</updated><author><name>Rickie</name><uri>http://www.cnblogs.com/rickie/</uri></author><link rel="alternate" href="http://www.cnblogs.com/rickie/archive/2011/05/16/2047305.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/rickie/archive/2011/05/16/2047305.html"/><content type="html">&lt;div&gt;&lt;span style="font-family:宋体;"&gt;如果你正在学习&lt;/span&gt;ASP.NET MVC 3&lt;span style="font-family:宋体;"&gt;，&lt;/span&gt;HTML5&lt;span style="font-family:宋体;"&gt;，&lt;/span&gt;jQuery&lt;span style="font-family:宋体;"&gt;和浏览器客户端交互技术，推荐你下载&lt;/span&gt;Mileage Stats &lt;span style="font-family:宋体;"&gt;范例程序，可更好理解如何使用当前技术创建当前的&lt;/span&gt;web&lt;span style="font-family:宋体;"&gt;应用程序，尤其关注如何架构一个企业级的应用程序。关于&lt;/span&gt;Mileage Stats&lt;span style="font-family:宋体;"&gt;项目的初步介绍，请参考《&lt;/span&gt;&lt;a href="http://www.entlib.net/?p=80"&gt;Project Silk &lt;span style="font-family:宋体;"&gt;&lt;span&gt;&amp;#8211;&lt;/span&gt; &lt;span style="font-family: 宋体;"&gt;基于&lt;/span&gt;ASP.NET MVC 3 &lt;span style="font-family:宋体;"&gt;的示例应用程序&lt;/span&gt;Mileage Stats&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: 宋体;"&gt;》。&lt;/span&gt;  &lt;p style="text-align:center" align="center"&gt;&lt;img alt="" src="http://images.cnblogs.com/cnblogs_com/rickie/entlib_net/projectsilk_thumb.png" height="154" width="164" /&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&lt;a href="http://www.entlib.com/"&gt;EntLib.com Team&lt;/a&gt; &lt;/span&gt;&lt;span style="font-family:宋体;"&gt;尝试从架构的角度对&lt;/span&gt;MileageStats&lt;span style="font-family:宋体;"&gt;项目进行分析和解读，并计划运用到实际的电子商务系统中，欢迎大家参与交流和分享。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;MileageStats RI &lt;span style="font-family:宋体;"&gt;运行的主要界面：&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;div align="center"&gt;&lt;img alt="" src="http://images.cnblogs.com/cnblogs_com/rickie/entlib_net/MileageStats_UI_1.png" height="431" width="600" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;MileageStats RI &lt;span style="font-family:宋体;"&gt;项目的当前架构图，主要有&lt;/span&gt;&lt;span&gt;Web &lt;/span&gt;&lt;span style="font-family:宋体;"&gt;表示层、业务逻辑层和数据访问层，如下图所示。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;div align="center"&gt;&lt;img alt="" src="http://images.cnblogs.com/cnblogs_com/rickie/entlib_net/MileageStats_Architecture_2.png" height="410" width="600" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;简要看看&lt;/span&gt;MileageStats &lt;span style="font-family:宋体;"&gt;包含的一些主要项目：&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;div align="center"&gt;&lt;img alt="" src="http://images.cnblogs.com/cnblogs_com/rickie/entlib_net/MileageStats_Solution_3.png" height="447" width="374" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span style="font-family:宋体;"&gt;创建数据模型（&lt;/span&gt;&lt;span&gt;Data Model&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;）&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;MileageStats.Model &lt;span style="font-family:宋体;"&gt;项目包含数据模型（&lt;/span&gt;&lt;span&gt;Data Model&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;）。结构化和强类型的类描述了业务数据的数据类型、关系和约束。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span style="font-family:宋体;"&gt;实现&lt;/span&gt;&lt;span&gt;Repository Pattern&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;在&lt;/span&gt;Repository&lt;span style="font-family:宋体;"&gt;模式中，&lt;/span&gt;Repository&lt;span style="font-family:宋体;"&gt;是一组接口，实现了数据访问相关的方法。接口没有暴露任何特定数据存储相关的类型。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;MileageStats.Data &lt;span style="font-family:宋体;"&gt;项目包含了&lt;/span&gt;Repository&lt;span style="font-family:宋体;"&gt;接口，&lt;/span&gt;&lt;span&gt;MileageStats.Data.SqlCe &lt;/span&gt;&lt;span style="font-family:宋体;"&gt;项目包含了接口的实现。如下是&lt;/span&gt;IReminderRepository &lt;span style="font-family:宋体;"&gt;接口的示例代码：&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;// contained in IReminderRepository.cs&lt;/p&gt;  &lt;p&gt;public interface IReminderRepository&lt;/p&gt;  &lt;p&gt;{&lt;/p&gt;  &lt;p style="margin-left:21.0pt;"&gt;void Create(int vehicleId, Reminder reminder);&lt;/p&gt;  &lt;p style="margin-left:21.0pt;"&gt;Reminder GetReminder(int reminderId);&lt;/p&gt;  &lt;p style="margin-left:21.0pt;"&gt;void Update(Reminder reminder);&lt;/p&gt;  &lt;p style="margin-left:21.0pt;"&gt;void Delete(int reminderId);&lt;/p&gt;  &lt;p style="margin-left:21.0pt;"&gt;&lt;/p&gt;  &lt;p style="margin-left:21.0pt;"&gt;IEnumerable&amp;lt;Reminder&amp;gt; GetRemindersForVehicle(int vehicleId);&lt;/p&gt;  &lt;p style="margin-left:21.0pt;"&gt;IEnumerable&amp;lt;Reminder&amp;gt; GetOverdueReminders(int vehicleId,&lt;/p&gt;  &lt;p style="margin-left:21.0pt;"&gt;DateTime forDate, int forOdometer);&lt;/p&gt;  &lt;p style="margin-left:21.0pt;"&gt;&lt;/p&gt;  &lt;p style="margin-left:21.0pt;"&gt;IEnumerable&amp;lt;Reminder&amp;gt; GetUpcomingReminders(int vehicleId,&lt;/p&gt;  &lt;p style="margin-left:21.0pt;"&gt;DateTime forStartDate, DateTime forEndDate,&lt;/p&gt;  &lt;p style="margin-left:21.0pt;"&gt;int odometer, int warningOdometer);&lt;/p&gt;  &lt;p style="margin-left:21.0pt;"&gt;&lt;/p&gt;  &lt;p style="margin-left:21.0pt;"&gt;&lt;span&gt;IEnumerable&amp;lt;Reminder&amp;gt; GetFulfilledRemindersForVehicle(int vehicleId);&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;}&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span style="font-family:宋体;"&gt;分解应用程序代码到&lt;/span&gt;&lt;span&gt;ASP.NET MVC&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;模式&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;设计良好的&lt;/span&gt;MVC&lt;span style="font-family:宋体;"&gt;应用程序保持&lt;/span&gt;Controller&lt;span style="font-family:宋体;"&gt;和&lt;/span&gt;Action&lt;span style="font-family:宋体;"&gt;方法比较小，&lt;/span&gt;View&lt;span style="font-family:宋体;"&gt;比较简单。大部分的核心应用程序逻辑存放在&lt;/span&gt;Model&lt;span style="font-family:宋体;"&gt;中。在&lt;/span&gt;MVC&lt;span style="font-family:宋体;"&gt;应用程序创建时，保持&lt;/span&gt;DRY&lt;span style="font-family:宋体;"&gt;（&lt;/span&gt;Don&amp;#8217;t Repeat Yourself&lt;span style="font-family:宋体;"&gt;）原则比后期试图清理代码更容易。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;因为大部分应用程序逻辑在&lt;/span&gt;Model&lt;span style="font-family:宋体;"&gt;层中，因此很多&lt;/span&gt;MVC &lt;span style="font-family:宋体;"&gt;应用程序包含不同类型的&lt;/span&gt;Model&lt;span style="font-family:宋体;"&gt;：&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:21.0pt;text-indent:-21.0pt;"&gt;&lt;span style="font-family:Wingdings;"&gt;l&amp;nbsp;&lt;/span&gt;View models&lt;span style="font-family:宋体;"&gt;（视图模型）&lt;/span&gt; - &lt;span style="font-family:宋体;"&gt;仅用于视图的数据绑定，这些&lt;/span&gt;Models&lt;span style="font-family:宋体;"&gt;包含于&lt;/span&gt;MVC &lt;span style="font-family:宋体;"&gt;应用程序中，一般与&lt;/span&gt;Views&lt;span style="font-family:宋体;"&gt;和&lt;/span&gt;Partial Views&lt;span style="font-family:宋体;"&gt;保持相同的构成结构。&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:21.0pt;text-indent:-21.0pt;"&gt;&lt;span style="font-family:Wingdings;"&gt;l&amp;nbsp;&lt;/span&gt;Application, domain, or service models&lt;span style="font-family: 宋体;"&gt;（业务模型）&lt;/span&gt; - &lt;span style="font-family:宋体;"&gt;基于实际业务需要建立的数据模型，可添加属性标注，或扩展支持应用功能，如数据验证、身份验证。因为这些&lt;/span&gt;Models&lt;span style="font-family:宋体;"&gt;易于往返于客户端浏览器，因此它们经常包含于&lt;/span&gt;View Models&lt;span style="font-family:宋体;"&gt;，并直接在&lt;/span&gt;HTML &lt;span style="font-family:宋体;"&gt;表单进行数据绑定。&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:21.0pt;text-indent:-21.0pt;"&gt;&lt;span style="font-family:Wingdings;"&gt;l&amp;nbsp;&lt;/span&gt;Data models&lt;span style="font-family:宋体;"&gt;（数据模型）&lt;/span&gt; - &lt;span style="font-family:宋体;"&gt;用于数据服务和存储，不会暴露在应用程序之外，经常封装在服务层。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;如下是&lt;/span&gt;MileageStats RI Solution&lt;span style="font-family:宋体;"&gt;中包含的&lt;/span&gt;3&lt;span style="font-family:宋体;"&gt;个&lt;/span&gt;Model&lt;span style="font-family:宋体;"&gt;项目&lt;/span&gt; &amp;#8211; &lt;span style="font-family:宋体;"&gt;下图中选中的项目，分别在&lt;/span&gt;Web&lt;span style="font-family:宋体;"&gt;层、业务逻辑层和数据层：&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;div align="center"&gt;&lt;img alt="" src="http://images.cnblogs.com/cnblogs_com/rickie/entlib_net/MileageStats_Solution_4.png" height="726" width="412" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;对于比较复杂或长期维护的应用程序，应该分离业务模型和数据模型。如果业务模型和数据模型的层级和接口差异很大，则创建完全分离的类。如业务模型和数据模型有匹配的层级和兼容的接口，则建议业务模型类继承数据模型类。如业务模型和数据模型有匹配的层级，但接口不兼容（如数据模型类接口不适合于业务模型类），则在业务模型类中通过聚集关系，包含数据模型类实例。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;div align="center"&gt;&lt;img alt="" src="http://images.cnblogs.com/cnblogs_com/rickie/entlib_net/MileageStats_Model_5.png" height="452" width="600" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;在编写&lt;/span&gt;Controller Action&lt;span style="font-family:宋体;"&gt;方法时，应将一些复杂的方法包装为&lt;/span&gt;model&lt;span style="font-family:宋体;"&gt;和&lt;/span&gt;service&lt;span style="font-family:宋体;"&gt;层的辅助方法或类中。优先采用&lt;/span&gt;action&lt;span style="font-family:宋体;"&gt;过滤器属性，如&lt;/span&gt;HttpPostAttribute&lt;span style="font-family:宋体;"&gt;，避免在每一个&lt;/span&gt;action&lt;span style="font-family:宋体;"&gt;方法中检测&lt;/span&gt;HttpContext&lt;span style="font-family:宋体;"&gt;，编写逻辑判断。此外，使用&lt;/span&gt;action&lt;span style="font-family:宋体;"&gt;过滤器进行横切关切点（&lt;/span&gt;Cross-cutting concern&lt;span style="font-family:宋体;"&gt;），如认证（&lt;/span&gt;AuthorizeAttribute&lt;span style="font-family:宋体;"&gt;）、错误处理（&lt;/span&gt;HandleErrorAttribute&lt;span style="font-family:宋体;"&gt;）等等。处理&lt;/span&gt;GET&lt;span style="font-family:宋体;"&gt;请求的方法应仅包含一些方法调用，而不必包含太多业务判断逻辑；处理&lt;/span&gt;POST &lt;span style="font-family:宋体;"&gt;请求的方法应验证传入的数据，在数据合法的情况下，执行更新操作，并根据更新结果，返回对应视图。&lt;/span&gt;MileageStats RI &lt;span style="font-family:宋体;"&gt;应用程序的如下范例显示&lt;/span&gt;2&lt;span style="font-family:宋体;"&gt;个版本的&lt;/span&gt;Add&lt;span style="font-family:宋体;"&gt;方法（分别为&lt;/span&gt;GET&lt;span style="font-family:宋体;"&gt;和&lt;/span&gt;POST&lt;span style="font-family:宋体;"&gt;版本）：&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;span style="font-size:12.0pt;font-family: &amp;quot;Miriam Fixed&amp;quot;;Miriam Fixed&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green"&gt;// GET: /Fillups/Add/1&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;span style="font-size:12.0pt;font-family: &amp;quot;Miriam Fixed&amp;quot;;Miriam Fixed&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;ActionResult&lt;/span&gt; Add(&lt;span style="color:blue"&gt;int&lt;/span&gt; vehicleId)&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;span style="font-size:12.0pt;font-family: &amp;quot;Miriam Fixed&amp;quot;;Miriam Fixed&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;span style="font-size:12.0pt;font-family: &amp;quot;Miriam Fixed&amp;quot;;Miriam Fixed&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;var&lt;/span&gt; vehicles = &lt;span style="color:blue"&gt;this&lt;/span&gt;.businessServices.GetVehicles(&lt;span style="color:blue"&gt;this&lt;/span&gt;.User.MileageStatsIdentity().UserId);&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;span style="font-size:12.0pt;font-family: &amp;quot;Miriam Fixed&amp;quot;;Miriam Fixed&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2B91AF"&gt;Vehicle&lt;/span&gt; vehicle = vehicles.First(v =&amp;gt; v.VehicleId == vehicleId);&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;span style="font-size:12.0pt;font-family: &amp;quot;Miriam Fixed&amp;quot;;Miriam Fixed&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;var&lt;/span&gt; newFillupEntry = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;FillupEntry&lt;/span&gt;()&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;span style="font-size:12.0pt;font-family: &amp;quot;Miriam Fixed&amp;quot;;Miriam Fixed&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;span style="font-size:12.0pt;font-family: &amp;quot;Miriam Fixed&amp;quot;;Miriam Fixed&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Odometer = vehicle.Odometer.HasValue ? vehicle.Odometer.Value : 0&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;span style="font-size:12.0pt;font-family: &amp;quot;Miriam Fixed&amp;quot;;Miriam Fixed&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;span style="font-size:12.0pt;font-family: &amp;quot;Miriam Fixed&amp;quot;;Miriam Fixed&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;var&lt;/span&gt; fillups = &lt;span style="color:blue"&gt;this&lt;/span&gt;.GetVehicleFillupsDescending(vehicleId);&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;span style="font-size:12.0pt;font-family: &amp;quot;Miriam Fixed&amp;quot;;Miriam Fixed&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;var&lt;/span&gt; model = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;FillupViewModel&lt;/span&gt;()&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;span style="font-size:12.0pt;font-family: &amp;quot;Miriam Fixed&amp;quot;;Miriam Fixed&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;span style="font-size:12.0pt;font-family: &amp;quot;Miriam Fixed&amp;quot;;Miriam Fixed&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; VehicleList = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;VehicleListViewModel&lt;/span&gt;(vehicles, vehicle) { IsCollapsed = &lt;span style="color:blue"&gt;true&lt;/span&gt; },&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;span style="font-size:12.0pt;font-family: &amp;quot;Miriam Fixed&amp;quot;;Miriam Fixed&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Fillups = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;SelectedItemList&lt;/span&gt;&amp;lt;&lt;span style="color:#2B91AF"&gt;FillupEntry&lt;/span&gt;&amp;gt;(fillups, newFillupEntry),&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;span style="font-size:12.0pt;font-family: &amp;quot;Miriam Fixed&amp;quot;;Miriam Fixed&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FillupEntry = newFillupEntry&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;span style="font-size:12.0pt;font-family: &amp;quot;Miriam Fixed&amp;quot;;Miriam Fixed&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;span style="font-size:12.0pt;font-family: &amp;quot;Miriam Fixed&amp;quot;;Miriam Fixed&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;this&lt;/span&gt;.ViewBag.IsFirstFillup = (fillups.Count == 0);&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;span style="font-size:12.0pt;font-family: &amp;quot;Miriam Fixed&amp;quot;;Miriam Fixed&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;return&lt;/span&gt; &lt;span style="color:blue"&gt;this&lt;/span&gt;.View(model);&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;span style="font-size:12.0pt;font-family: &amp;quot;Miriam Fixed&amp;quot;;Miriam Fixed&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;span style="font-size:12.0pt;font-family: &amp;quot;Miriam Fixed&amp;quot;;Miriam Fixed&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green"&gt;//&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;span style="font-size:12.0pt;font-family: &amp;quot;Miriam Fixed&amp;quot;;Miriam Fixed&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green"&gt;// POST: /Fillups/Add/5&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;span style="font-size:12.0pt;font-family: &amp;quot;Miriam Fixed&amp;quot;;Miriam Fixed&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;span style="color:#2B91AF"&gt;HttpPost&lt;/span&gt;]&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;span style="font-size:12.0pt;font-family: &amp;quot;Miriam Fixed&amp;quot;;Miriam Fixed&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;span style="color:#2B91AF"&gt;ValidateInput&lt;/span&gt;(&lt;span style="color:blue"&gt;false&lt;/span&gt;)]&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;span style="font-size:12.0pt;font-family: &amp;quot;Miriam Fixed&amp;quot;;Miriam Fixed&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;span style="color:#2B91AF"&gt;ValidateAntiForgeryToken&lt;/span&gt;]&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;span style="font-size:12.0pt;font-family: &amp;quot;Miriam Fixed&amp;quot;;Miriam Fixed&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;ActionResult&lt;/span&gt; Add(&lt;span style="color:blue"&gt;int&lt;/span&gt; vehicleId, &lt;span style="color:#2B91AF"&gt;FillupEntry&lt;/span&gt; model)&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;span style="font-size:12.0pt;font-family: &amp;quot;Miriam Fixed&amp;quot;;Miriam Fixed&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;span style="font-size:12.0pt;font-family: &amp;quot;Miriam Fixed&amp;quot;;Miriam Fixed&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;if&lt;/span&gt; (&lt;span style="color:blue"&gt;this&lt;/span&gt;.ModelState.IsValid)&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;span style="font-size:12.0pt;font-family: &amp;quot;Miriam Fixed&amp;quot;;Miriam Fixed&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;span style="font-size:12.0pt;font-family: &amp;quot;Miriam Fixed&amp;quot;;Miriam Fixed&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;this&lt;/span&gt;.AddModelErrors(&lt;span style="color:blue"&gt;this&lt;/span&gt;.businessServices.CanAddFillup(&lt;span style="color:blue"&gt;this&lt;/span&gt;.CurrentUserId, vehicleId, model),&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;span style="font-size:12.0pt;font-family: &amp;quot;Miriam Fixed&amp;quot;;Miriam Fixed&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#A31515"&gt;"AddFillup"&lt;/span&gt;);&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;span style="font-size:12.0pt;font-family: &amp;quot;Miriam Fixed&amp;quot;;Miriam Fixed&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;if&lt;/span&gt; (&lt;span style="color:blue"&gt;this&lt;/span&gt;.ModelState.IsValid)&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;span style="font-size:12.0pt;font-family: &amp;quot;Miriam Fixed&amp;quot;;Miriam Fixed&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;span style="font-size:12.0pt;font-family: &amp;quot;Miriam Fixed&amp;quot;;Miriam Fixed&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;this&lt;/span&gt;.businessServices.AddFillupToVehicle(&lt;span style="color:blue"&gt;this&lt;/span&gt;.CurrentUserId, vehicleId, model);&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;span style="font-size:12.0pt;font-family: &amp;quot;Miriam Fixed&amp;quot;;Miriam Fixed&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;this&lt;/span&gt;.TempData[&lt;span style="color:#A31515"&gt;"LastActionMessage"&lt;/span&gt;] = &lt;span style="color:#2B91AF"&gt;Resources&lt;/span&gt;.VehicleController_AddFillupSuccessMessage;&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;span style="font-size:12.0pt;font-family: &amp;quot;Miriam Fixed&amp;quot;;Miriam Fixed&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;return&lt;/span&gt; &lt;span style="color:blue"&gt;this&lt;/span&gt;.RedirectToAction(&lt;span style="color:#A31515"&gt;"List"&lt;/span&gt;, &lt;span style="color:#A31515"&gt;"Fillup"&lt;/span&gt;, &lt;span style="color:blue"&gt;new&lt;/span&gt; { vehicleId = vehicleId });&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;span style="font-size:12.0pt;font-family: &amp;quot;Miriam Fixed&amp;quot;;Miriam Fixed&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;span style="font-size:12.0pt;font-family: &amp;quot;Miriam Fixed&amp;quot;;Miriam Fixed&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;span style="font-size:12.0pt;font-family: &amp;quot;Miriam Fixed&amp;quot;;Miriam Fixed&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue"&gt;var&lt;/span&gt; vehicles = &lt;span style="color:blue"&gt;this&lt;/span&gt;.businessServices.GetVehicles(&lt;span style="color:blue"&gt;this&lt;/span&gt;.CurrentUserId);&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;span style="font-size:12.0pt;font-family: &amp;quot;Miriam Fixed&amp;quot;;Miriam Fixed&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2B91AF"&gt;Vehicle&lt;/span&gt; vehicle = vehicles.First(v =&amp;gt; v.VehicleId == vehicleId);&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;span style="font-size:12.0pt;font-family: &amp;quot;Miriam Fixed&amp;quot;;Miriam Fixed&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;var&lt;/span&gt; fillups = &lt;span style="color:blue"&gt;this&lt;/span&gt;.GetVehicleFillupsDescending(vehicleId);&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;span style="font-size:12.0pt;font-family: &amp;quot;Miriam Fixed&amp;quot;;Miriam Fixed&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;var&lt;/span&gt; viewModel = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;FillupViewModel&lt;/span&gt;()&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;span style="font-size:12.0pt;font-family: &amp;quot;Miriam Fixed&amp;quot;;Miriam Fixed&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;span style="font-size:12.0pt;font-family: &amp;quot;Miriam Fixed&amp;quot;;Miriam Fixed&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; VehicleList = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;VehicleListViewModel&lt;/span&gt;(vehicles, vehicle) { IsCollapsed = &lt;span style="color:blue"&gt;true&lt;/span&gt; },&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;span style="font-size:12.0pt;font-family: &amp;quot;Miriam Fixed&amp;quot;;Miriam Fixed&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Fillups = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;SelectedItemList&lt;/span&gt;&amp;lt;&lt;span style="color:#2B91AF"&gt;FillupEntry&lt;/span&gt;&amp;gt;(fillups, model),&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;span style="font-size:12.0pt;font-family: &amp;quot;Miriam Fixed&amp;quot;;Miriam Fixed&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FillupEntry = model&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;span style="font-size:12.0pt;font-family: &amp;quot;Miriam Fixed&amp;quot;;Miriam Fixed&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;span style="font-size:12.0pt;font-family: &amp;quot;Miriam Fixed&amp;quot;;Miriam Fixed&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;this&lt;/span&gt;.ViewBag.IsFirstFillup = (fillups.Count == 0);&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;span style="font-size:12.0pt;font-family: &amp;quot;Miriam Fixed&amp;quot;;Miriam Fixed&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;return&lt;/span&gt; &lt;span style="color:blue"&gt;this&lt;/span&gt;.View(viewModel);&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-autospace:none" align="left"&gt;&lt;span style="font-size:12.0pt;font-family: &amp;quot;Miriam Fixed&amp;quot;;Miriam Fixed&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span style="font-family:宋体;"&gt;依赖注入&lt;/span&gt;&lt;span&gt; - Dependency Injection&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;解耦应用程序的组件（&lt;/span&gt;Decoupling the application components&lt;span style="font-family: 宋体;"&gt;）。关于&lt;/span&gt;Unity 2.0 &lt;span style="font-family:宋体;"&gt;依赖注入容器在&lt;/span&gt;&lt;span&gt;ASP.NET MVC 3 &lt;/span&gt;&lt;span style="font-family:宋体;"&gt;项目的具体使用细节，可参考文章&lt;/span&gt; - &lt;a href="http://www.entlib.net/?p=177"&gt;&lt;span style="font-family:宋体;"&gt;&lt;span&gt;在&lt;/span&gt;ASP.NET MVC &lt;span style="font-family:宋体;"&gt;项目使用&lt;/span&gt;Unity 2.0&lt;span style="font-family:宋体;"&gt;实现依赖注入&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:宋体;"&gt;。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span style="font-family:宋体;"&gt;创建&lt;/span&gt;&lt;span&gt;Business Service &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family:宋体;"&gt;层&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;为了项目的可维护和支持不同类型的客户端，大型和复杂的应用程序经常需要额外的架构层&lt;/span&gt; &amp;#8211; Business Service Layer&lt;span style="font-family:宋体;"&gt;，将业务逻辑从数据访问层分离出来。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;本文参考和编译了如下文章部分内容：&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;Project Silk 1.0 &amp;#8211; Server-side Architecture&lt;/p&gt;  &lt;p&gt;Project Silk - &lt;a href="http://silk.codeplex.com/"&gt;http://silk.codeplex.com/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;br /&gt;&lt;/p&gt;  &lt;/div&gt;&lt;img src="http://www.cnblogs.com/rickie/aggbug/2047305.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/rickie/archive/2011/05/16/2047305.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/rickie/archive/2011/05/03/2035877.html</id><title type="text">ASP.NET MVC 最佳开发实践（1）</title><summary type="text">本文提供了一些ASP.NET MVC 代码设计准则，涉及Model、View、Controller、Routing、Testability、Security、Localization and Globalization 等等内容，目标是帮助ASP.NET MVC 开发人员创建可靠的应用程序，当然，你可根据实际应用程序选择合适的标准，本文的英文原文为 Best Practices for ASP.NET MVC。</summary><published>2011-05-03T13:05:00Z</published><updated>2011-05-03T13:05:00Z</updated><author><name>Rickie</name><uri>http://www.cnblogs.com/rickie/</uri></author><link rel="alternate" href="http://www.cnblogs.com/rickie/archive/2011/05/03/2035877.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/rickie/archive/2011/05/03/2035877.html"/><content type="html">&lt;span style="font-family: 宋体;"&gt;本文提供了一些代码设计准则，目标是帮助&lt;/span&gt;ASP.NET MVC &lt;span style="font-family: 宋体;"&gt;开发人员创建可靠的应用程序，当然，你可根据实际应用程序选择合适的标准。本文由&lt;/span&gt;&lt;a href="http://www.entlib.com/"&gt;EntLib.com&lt;/a&gt; &lt;span style="font-family: 宋体;"&gt;小组翻译，欢迎分享和交流&lt;/span&gt;&lt;span&gt;ASP.NET MVC &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;项目开发设计思路。&lt;/span&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span style="font-size: 15pt;"&gt;Model&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-size: 15pt; font-family: 宋体;"&gt;建议&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-size: 15pt;"&gt; - Model Recommendations&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Model&lt;span style="font-family: 宋体;"&gt;是定义业务领域相关的对象，应该包含业务逻辑（对象如何动作和关联），验证逻辑（验证对象的有效值），数据逻辑（数据对象如何持久化），和会话逻辑（跟踪用户状态）。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;创建独立的&lt;/span&gt;Model&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;项目，在&lt;/span&gt;ASP.NET MVC &lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;项目中引用&lt;/span&gt;Model&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;程序集。&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;将所有业务逻辑放置在&lt;/span&gt;Model&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;中。&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: 宋体;"&gt;如将所有业务逻辑放置在&lt;/span&gt;Model&lt;span style="font-family: 宋体;"&gt;项目中，可根据实际业务数据来生成&lt;/span&gt;View&lt;span style="font-family: 宋体;"&gt;和&lt;/span&gt;Controller&lt;span style="font-family: 宋体;"&gt;。有如下好处：&lt;/span&gt;&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;span style="font-family: Wingdings;"&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;减少重复的业务逻辑。&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Wingdings;"&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;在&lt;/span&gt;View&lt;span style="font-family: 宋体;"&gt;中减少业务逻辑，&lt;/span&gt;View&lt;span style="font-family: 宋体;"&gt;易于理解。&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Wingdings;"&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;业务逻辑的测试仅仅和&lt;/span&gt;Model&lt;span style="font-family: 宋体;"&gt;有关。&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;      &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: 宋体;"&gt;例如，下面需要显示用户的用户名&lt;/span&gt; &amp;#8211; &lt;span style="font-family: 宋体;"&gt;先显示&lt;/span&gt;Last Name&lt;span style="font-family: 宋体;"&gt;，在&lt;/span&gt;View&lt;span style="font-family: 宋体;"&gt;中代码如下：&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;&lt;span style="background-color: #ffff00; color: #000000;"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;String&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;.Compare((&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;)TempData[&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #800000;"&gt;"&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #800000;"&gt;displayLastNameFirst&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #800000;"&gt;"&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;],&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #800000;"&gt;"&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #800000;"&gt;on&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #800000;"&gt;"&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;==&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #800080;"&gt;0&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: #ffff00; color: #000000;"&gt;%&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Welcome,&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: #ffff00; color: #000000;"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;=&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;&amp;nbsp;Model.lastName&lt;/span&gt;&lt;span style="background-color: #ffff00; color: #000000;"&gt;%&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: #ffff00; color: #000000;"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;=&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;&amp;nbsp;Model.firstName&lt;/span&gt;&lt;span style="background-color: #ffff00; color: #000000;"&gt;%&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="background-color: #ffff00; color: #000000;"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: #ffff00; color: #000000;"&gt;%&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Welcome,&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: #ffff00; color: #000000;"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;=&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;&amp;nbsp;Model.firstName&lt;/span&gt;&lt;span style="background-color: #ffff00; color: #000000;"&gt;%&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: #ffff00; color: #000000;"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;=&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;&amp;nbsp;Model.lastName&lt;/span&gt;&lt;span style="background-color: #ffff00; color: #000000;"&gt;%&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="background-color: #ffff00; color: #000000;"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;&amp;nbsp;}&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: #ffff00; color: #000000;"&gt;%&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: 宋体;"&gt;然而你需要在每一个地方重复这一逻辑。如将这一业务逻辑放置在&lt;/span&gt;Model&lt;span style="font-family: 宋体;"&gt;中，可在&lt;/span&gt;Model&lt;span style="font-family: 宋体;"&gt;中添加一个属性封装这一逻辑。&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;combinedName&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(displayLastNameFirst&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;?&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;lastName&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;firstName&amp;nbsp;:&amp;nbsp;firstName&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;lastName);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;这样，可大大简化视图代码：&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&amp;lt;% Welcome, &amp;lt;%= Model.combinedName %&amp;gt; %&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;将所有验证逻辑放置在&lt;/span&gt;Model&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;中&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: 宋体;"&gt;所有输入验证应该在&lt;/span&gt;Model&lt;span style="font-family: 宋体;"&gt;层，包括&lt;/span&gt;Client-side &lt;span style="font-family: 宋体;"&gt;验证。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: 宋体;"&gt;可使用&lt;/span&gt;ModelState &lt;span style="font-family: 宋体;"&gt;添加验证检查，代码如下所示：&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;if (String.IsNullOrEmpty(userName))&lt;/p&gt;  &lt;p&gt;{&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;ModelState.AddModelError("username", Resources.SignUp.UserNameError);&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;}&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: 宋体;"&gt;不过，更好的办法是使用&lt;/span&gt; System.ComponentModel.DataAnnotations&lt;span style="font-family: 宋体;"&gt;，在&lt;/span&gt;Model&lt;span style="font-family: 宋体;"&gt;类的属性上添加&lt;/span&gt;attribute&lt;span style="font-family: 宋体;"&gt;，如下所示：&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;public class User&lt;/p&gt;  &lt;p&gt;{&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;[Required(ErrorMessageResourceName = "nameRequired", ErrorMessageResourceType = typeof(Resources.User))]&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;public String userName { get; set; }&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;...&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;}&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;为数据访问定义接口&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: 宋体;"&gt;接口用来暴露数据访问类的方法，强化&lt;/span&gt;ASP.NET MVC &lt;span style="font-family: 宋体;"&gt;的松散耦合设计。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: 宋体;"&gt;可考虑使用&lt;/span&gt;Entity Framework &lt;span style="font-family: 宋体;"&gt;或&lt;/span&gt; LINQ to SQL &lt;span style="font-family: 宋体;"&gt;创建对数据库的访问类，&lt;/span&gt;Entity Framework &lt;span style="font-family: 宋体;"&gt;和&lt;/span&gt; LINQ to SQL &lt;span style="font-family: 宋体;"&gt;都支持存储过程。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;将所有会话逻辑放置在&lt;/span&gt;Model&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;中。&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span style="font-size: 15pt;"&gt;View &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-size: 15pt; font-family: 宋体;"&gt;建议&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-size: 15pt;"&gt; - View Recommendations&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;View&lt;span style="font-family: 宋体;"&gt;用来展示&lt;/span&gt;Model&lt;span style="font-family: 宋体;"&gt;数据，&lt;/span&gt;Controller&lt;span style="font-family: 宋体;"&gt;负责选择&lt;/span&gt;View&lt;span style="font-family: 宋体;"&gt;。业务逻辑不属于&lt;/span&gt;View&lt;span style="font-family: 宋体;"&gt;，&lt;/span&gt;Model&lt;span style="font-family: 宋体;"&gt;负责业务逻辑。&lt;/span&gt;View&lt;span style="font-family: 宋体;"&gt;非常灵活，如&lt;/span&gt;Model&lt;span style="font-family: 宋体;"&gt;的&lt;/span&gt;View&lt;span style="font-family: 宋体;"&gt;可通过&lt;/span&gt;HTML&lt;span style="font-family: 宋体;"&gt;显示，同样的&lt;/span&gt;Model&lt;span style="font-family: 宋体;"&gt;也可通过&lt;/span&gt;XML &lt;span style="font-family: 宋体;"&gt;视图来呈现。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;将&lt;/span&gt;HTML&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;放置在&lt;/span&gt;View&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;和&lt;/span&gt;Partial View&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;中（不要在&lt;/span&gt;Controller&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;中）&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: 宋体;"&gt;默认的&lt;/span&gt;ASP.NET&lt;span style="font-family: 宋体;"&gt;视图引擎提供了如下视图文件：&lt;/span&gt;HTML View&lt;span style="font-family: 宋体;"&gt;（&lt;/span&gt;.aspx&lt;span style="font-family: 宋体;"&gt;），&lt;/span&gt;Partial HTML View&lt;span style="font-family: 宋体;"&gt;（&lt;/span&gt;.ascx&lt;span style="font-family: 宋体;"&gt;）和&lt;/span&gt;Master page&lt;span style="font-family: 宋体;"&gt;（&lt;/span&gt;.master&lt;span style="font-family: 宋体;"&gt;）&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: 宋体;"&gt;如下视图演示了对&lt;/span&gt;partial view&lt;span style="font-family: 宋体;"&gt;的调用：&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&amp;lt;%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: 宋体;"&gt;&amp;#8230;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Below is a list of items submitted by &amp;lt;b&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&amp;lt;%= Html.Encode(ViewData["name"]) %&amp;gt;&amp;lt;/b&amp;gt;.&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;p&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;...&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;div id="items"&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;% Html.RenderPartial("ItemsByName");%&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/div&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&amp;lt;/asp:content&amp;gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Partial view&lt;span style="font-family: 宋体;"&gt;（&lt;/span&gt;ItemsByName.ascx&lt;span style="font-family: 宋体;"&gt;）如下所示：&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&amp;lt;%@ Control Language="C#"&amp;nbsp;%&amp;gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: 宋体;"&gt;&amp;#8230;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;% foreach (Seller.Controllers.Items item in (IEnumerable)ViewData.Model)&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{ %&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;tr&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;%= Html.Encode(item.title)%&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/td&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;%= Html.Encode(item.price)%&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/td&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/tr&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;% } %&amp;gt; &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/table&amp;gt; &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;% } %&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;Partial View &lt;span style="font-family: 宋体;"&gt;是一个强大的扩展和重用机制。你可在不同的地方包含相同的&lt;/span&gt;View&lt;span style="font-family: 宋体;"&gt;，不必编写重复的代码。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;在&lt;/span&gt;View&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;中使用&lt;/span&gt;ViewData&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;访问数据&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;ASP.NET &lt;span style="font-family: 宋体;"&gt;提供了如下机制在&lt;/span&gt;View&lt;span style="font-family: 宋体;"&gt;模板中访问数据：&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;ViewData.Model &lt;span style="font-family: 宋体;"&gt;对象&lt;/span&gt; &amp;#8211; &lt;span style="font-family: 宋体;"&gt;在&lt;/span&gt;Controller&lt;span style="font-family: 宋体;"&gt;的&lt;/span&gt;action&lt;span style="font-family: 宋体;"&gt;方法中，在&lt;/span&gt;return&lt;span style="font-family: 宋体;"&gt;语句中传入一个&lt;/span&gt;Model&lt;span style="font-family: 宋体;"&gt;对象（&lt;/span&gt;&lt;span&gt;return View(myModelObject)&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;）。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;ViewData Dictionary &amp;#8211; &lt;span style="font-family: 宋体;"&gt;在&lt;/span&gt;action&lt;span style="font-family: 宋体;"&gt;方法中存入数据（&lt;/span&gt;&lt;span&gt;ViewData[&amp;#8220;key&amp;#8221;] = value&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;），接着在&lt;/span&gt;View&lt;span style="font-family: 宋体;"&gt;中方法相同的&lt;/span&gt;dictionary&lt;span style="font-family: 宋体;"&gt;。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: 宋体;"&gt;在可能的情况下，应该是一&lt;/span&gt;ViewData Model&lt;span style="font-family: 宋体;"&gt;，而不是&lt;/span&gt;ViewData &lt;span style="font-family: 宋体;"&gt;来访问数据，因为&lt;/span&gt;Model &lt;span style="font-family: 宋体;"&gt;提供了类型安全。此外，你应在&lt;/span&gt;View&lt;span style="font-family: 宋体;"&gt;模板中，使用数据访问机制，而不是&lt;/span&gt;Request / Session &lt;span style="font-family: 宋体;"&gt;来访问。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: 宋体;"&gt;如需要显示一个对象的多个属性，可使用&lt;/span&gt;ViewData.Model&lt;span style="font-family: 宋体;"&gt;，并创建一个强类型&lt;/span&gt;View&lt;span style="font-family: 宋体;"&gt;。针对&lt;/span&gt;seller&lt;span style="font-family: 宋体;"&gt;详细页面，&lt;/span&gt;seller&lt;span style="font-family: 宋体;"&gt;类有&lt;/span&gt;name&lt;span style="font-family: 宋体;"&gt;、&lt;/span&gt;phone&lt;span style="font-family: 宋体;"&gt;、&lt;/span&gt;address&lt;span style="font-family: 宋体;"&gt;、&lt;/span&gt;email&lt;span style="font-family: 宋体;"&gt;等等属性，在呈现&lt;/span&gt;View&lt;span style="font-family: 宋体;"&gt;之前，你可在&lt;/span&gt;Controller&lt;span style="font-family: 宋体;"&gt;中对&lt;/span&gt;ViewData.Model &lt;span style="font-family: 宋体;"&gt;赋值&lt;/span&gt;seller&lt;span style="font-family: 宋体;"&gt;对象实例。但是如果是一些零散的数据，如&lt;/span&gt;page#&lt;span style="font-family: 宋体;"&gt;、用户名和&lt;/span&gt;current time&lt;span style="font-family: 宋体;"&gt;，则一般使用&lt;/span&gt;ViewData&lt;span style="font-family: 宋体;"&gt;字典。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;在使用模型绑定（&lt;/span&gt;&lt;span&gt;Model bingding&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;）时，避免在&lt;/span&gt;view&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;中访问数据。&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: 宋体;"&gt;在&lt;/span&gt;Controller &lt;span style="font-family: 宋体;"&gt;中访问数据库，在执行&lt;/span&gt;View&lt;span style="font-family: 宋体;"&gt;之前，将从数据库中检索的数据复制给轻量的&lt;/span&gt;View Model&lt;span style="font-family: 宋体;"&gt;对象，这样，轻量的&lt;/span&gt;View Model&lt;span style="font-family: 宋体;"&gt;对象不必在视图执行时检索数据。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: 宋体;"&gt;使用（自动生成）客户端验证&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: 宋体;"&gt;从&lt;/span&gt;ASP.NET MVC 2 &lt;span style="font-family: 宋体;"&gt;开始，可以很容易添加客户端验证。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;(1) &lt;span style="font-family: 宋体;"&gt;如前所述，在&lt;/span&gt;Model&lt;span style="font-family: 宋体;"&gt;层中添加数据验证逻辑；&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;(2) &lt;span style="font-family: 宋体;"&gt;确保项目中&lt;/span&gt;Scripts&lt;span style="font-family: 宋体;"&gt;目录有如下&lt;/span&gt;&lt;span&gt;javascript &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;文件：&lt;/span&gt;MicrosoftAjax.js &lt;span style="font-family: 宋体;"&gt;和&lt;/span&gt; MicrosoftMvcValidation.js&lt;span style="font-family: 宋体;"&gt;；&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;(3) &lt;span style="font-family: 宋体;"&gt;在表单提交页面，添加如下代码：&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&amp;lt;script src="&amp;lt;%= Url.Content("~/Scripts/MicrosoftAjax.js") %&amp;gt;" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&amp;lt;script src="&amp;lt;%= Url.Content("~/Scripts/MicrosoftMvcValidation.js") %&amp;gt;" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;(4) &lt;span style="font-family: 宋体;"&gt;在表单中添加如下代码：&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&amp;lt;% Html.EnableClientValidation(); %&amp;gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: 宋体;"&gt;现在如果编辑表单内容，当输入值不合格时，客户端马上进行验证提醒。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;在模板中插入&lt;/span&gt;&lt;span&gt;server-side &lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;注释&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: 宋体;"&gt;在&lt;/span&gt;View&lt;span style="font-family: 宋体;"&gt;模板中使用服务端注释，在&lt;/span&gt;HTML&lt;span style="font-family: 宋体;"&gt;呈现时，会剔除。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: 宋体;"&gt;如下是&lt;/span&gt;server-side&lt;span style="font-family: 宋体;"&gt;注释：&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&amp;lt;%-- This is a server side template comment --%&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: 宋体;"&gt;不要在&lt;/span&gt;View&lt;span style="font-family: 宋体;"&gt;模板中使用&lt;/span&gt;HTML &lt;span style="font-family: 宋体;"&gt;注释，因为这些注释会呈现在&lt;/span&gt;web&lt;span style="font-family: 宋体;"&gt;浏览器中，可被用户看到。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;使用&lt;/span&gt;HTMLHelper &lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;扩展方法。&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;System.Web.Mvc.Html &lt;span style="font-family: 宋体;"&gt;类中包含了很多有用的&lt;/span&gt;&lt;span&gt;HTML &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;扩展方法。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;Form &lt;span style="font-family: 宋体;"&gt;表单生成（&lt;/span&gt;BeginForm&lt;span style="font-family: 宋体;"&gt;）&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: 宋体;"&gt;输入字段生成（&lt;/span&gt;checkbox&lt;span style="font-family: 宋体;"&gt;、&lt;/span&gt;hidden&lt;span style="font-family: 宋体;"&gt;、&lt;/span&gt;radio button&lt;span style="font-family: 宋体;"&gt;、&lt;/span&gt;textbox&lt;span style="font-family: 宋体;"&gt;）&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: 宋体;"&gt;链接&lt;/span&gt;URL&lt;span style="font-family: 宋体;"&gt;生成（&lt;/span&gt;ActionLink&lt;span style="font-family: 宋体;"&gt;）&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;XSS&lt;span style="font-family: 宋体;"&gt;保护（&lt;/span&gt;Encode&lt;span style="font-family: 宋体;"&gt;）&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: 宋体;"&gt;尽可能使用这些&lt;/span&gt;HTML&lt;span style="font-family: 宋体;"&gt;扩展方法，如下是使用&lt;/span&gt;route table&lt;span style="font-family: 宋体;"&gt;创建一个链接：&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&amp;lt;%= Html.ActionLink(&amp;#8220;Home page&amp;#8221;, &amp;#8220;Default&amp;#8221;) %&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;后续相关文章，可参考如下链接： &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;strong&gt;&lt;a title="链向 ASP.NET MVC 最佳开发实践（2） 的固定链接" rel="bookmark" href="http://www.entlib.net/?p=102"&gt;ASP.NET MVC 最佳开发实践（2）&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt; &lt;strong&gt;&lt;a title="链向 ASP.NET MVC 最佳开发实践（3） 的固定链接" rel="bookmark" href="http://www.entlib.net/?p=110"&gt;ASP.NET MVC 最佳开发实践（3）&lt;/a&gt;&lt;/strong&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;英文原文链接：&lt;/strong&gt;&lt;br /&gt; Best Practices for ASP.NET MVC&lt;br /&gt; &lt;a href="http://blogs.msdn.com/b/aspnetue/archive/2010/09/17/second_2d00_post.aspx"&gt;http://blogs.msdn.com/b/aspnetue/archive/2010/09/17/second_2d00_post.aspx&lt;/a&gt; &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/rickie/aggbug/2035877.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/rickie/archive/2011/05/03/2035877.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/rickie/archive/2011/04/22/2024981.html</id><title type="text">IoC 容器 -- Autofac</title><summary type="text">目前可使用的IoC（Inversion of Control，控制反转）容器有很多，如 Unity、Castle Windsor、Autofac、StructureMap等等。下面是 Autofac 容器的下载网址：http://code.google.com/p/autofac/</summary><published>2011-04-22T07:44:00Z</published><updated>2011-04-22T07:44:00Z</updated><author><name>Rickie</name><uri>http://www.cnblogs.com/rickie/</uri></author><link rel="alternate" href="http://www.cnblogs.com/rickie/archive/2011/04/22/2024981.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/rickie/archive/2011/04/22/2024981.html"/><content type="html">&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;目前可使用的IoC（Inversion of Control，控制反转）容器有很多，如 Unity、Castle Windsor、Autofac、StructureMap等等。&lt;/p&gt;&#xD;
&lt;p&gt;下面是 Autofac 容器的下载网址：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://code.google.com/p/autofac/"&gt;http://code.google.com/p/autofac/&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img border="0" alt="" src="http://code.google.com/p/autofac/logo?cct=1301569287" /&gt;&lt;/p&gt;&#xD;
&amp;nbsp;&amp;nbsp;&#xD;
&lt;img src="http://www.cnblogs.com/rickie/aggbug/2024981.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/rickie/archive/2011/04/22/2024981.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/rickie/archive/2011/04/21/2024375.html</id><title type="text">ASP.NET MVC 自定义view engine</title><summary type="text">1. 先看下webformviewengine的构造函数： publicWebFormViewEngine(){base.MasterLocationFormats=newstring[]{&amp;quot;~/Views/{1}/{0}.master&amp;quot;,&amp;quot;~/Views/Shared/{0}.master&amp;quot;};base.ViewLocationFormats=newstring[]{&amp;quot;~/Views/{1}/{0}.aspx&amp;quot;,&amp;quot;~/Views/{1}/{0}.ascx&amp;quot;,&amp;quot;~/Views/Shared/{0}.asp</summary><published>2011-04-21T15:15:00Z</published><updated>2011-04-21T15:15:00Z</updated><author><name>Rickie</name><uri>http://www.cnblogs.com/rickie/</uri></author><link rel="alternate" href="http://www.cnblogs.com/rickie/archive/2011/04/21/2024375.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/rickie/archive/2011/04/21/2024375.html"/><content type="html">&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;1. 先看下webformviewengine的构造函数： &lt;div&gt;&lt;div id="cnblogs_code_open_e3c431bf-619d-416d-a308-94db5a13c861"&gt; &lt;div&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;WebFormViewEngine()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;base&lt;/span&gt;&lt;span style="color: #000000;"&gt;.MasterLocationFormats&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;[]&amp;nbsp;{&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;~/Views/{1}/{0}.master&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;~/Views/Shared/{0}.master&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;base&lt;/span&gt;&lt;span style="color: #000000;"&gt;.ViewLocationFormats&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;[]&amp;nbsp;{&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;~/Views/{1}/{0}.aspx&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;~/Views/{1}/{0}.ascx&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;~/Views/Shared/{0}.aspx&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;~/Views/Shared/{0}.ascx&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;base&lt;/span&gt;&lt;span style="color: #000000;"&gt;.PartialViewLocationFormats&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;base&lt;/span&gt;&lt;span style="color: #000000;"&gt;.ViewLocationFormats;&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt; &lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;base.ViewLocationFormats 可以看出view  page为什么只能写在views文件夹下的原因了。所以我们只需要在新的view  engine的构造函数中修改下base.ViewLocationFormats  路径即可。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;2. 下面是一个自定义的View Engine -- SkinSupportViewEngine,它需要继承WebFormViewEngine。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class SkinSupportViewEngine : WebFormViewEngine&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public SkinSupportViewEngine()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string[] mastersLocation = new[]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string.Format("~/skins/{0}/{0}.master",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Utils.SkinName)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MasterLocationFormats = this.AddNewLocationFormats(new List&amp;lt;string&amp;gt;(MasterLocationFormats),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mastersLocation);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string[] viewsLocation = new[]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string.Format("~/skins/{0}/Views/{{1}}/{{0}}.aspx",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Utils.SkinName),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string.Format("~/skins/{0}/Views/{{1}}/{{0}}.ascx",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Utils.SkinName)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ViewLocationFormats =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PartialViewLocationFormats = this.AddNewLocationFormats(new List&amp;lt;string&amp;gt;(ViewLocationFormats),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; viewsLocation);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/div&gt;&lt;p&gt;......&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;3. 最后还需要在Global 文件中注册新的View Engine&lt;/p&gt;&lt;p&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ViewEngines.Engines.Clear();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ViewEngines.Engines.Add(new SkinSupportViewEngine());&lt;/div&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/rickie/aggbug/2024375.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/rickie/archive/2011/04/21/2024375.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/rickie/archive/2011/04/19/2021618.html</id><title type="text">Html.RenderPartial与Html.RenderAction的区别</title><summary type="text">Html.RenderPartial与Html.RenderAction这两个方法都是用来在界面上嵌入用户控件的。 Html.RenderPartial是直接将用户控件嵌入到界面上： &amp;lt;%Html.RenderPartial(&amp;quot;LogOnUserControl&amp;quot;);%&amp;gt; 或 &amp;lt;%Html.RenderPartial(&amp;quot;~/Areas/Comm/Views/Shared/LogOnUserControl.ascx&amp;quot;);%&amp;gt; 注意：用第一种方法时，用户控件必须放在调用者同一目录下，也可以放在View/Shared中。 Html.Ren</summary><published>2011-04-19T14:16:00Z</published><updated>2011-04-19T14:16:00Z</updated><author><name>Rickie</name><uri>http://www.cnblogs.com/rickie/</uri></author><link rel="alternate" href="http://www.cnblogs.com/rickie/archive/2011/04/19/2021618.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/rickie/archive/2011/04/19/2021618.html"/><content type="html">&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;div&gt;&lt;div id="sina_keyword_ad_area2"&gt; 			&lt;p&gt;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt; Html.RenderPartial与Html.RenderAction这两个方法都是用来在界面上嵌入用户控件的。&lt;/p&gt; &lt;p&gt;&lt;wbr&gt;&lt;/p&gt; &lt;p&gt;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt; Html.RenderPartial是直接将用户控件嵌入到界面上：&lt;/p&gt; &lt;p&gt;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt; &amp;lt;%Html.RenderPartial("LogOnUserControl");%&amp;gt;&lt;/p&gt; &lt;p&gt;或&lt;/p&gt; &lt;p&gt;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt; &amp;lt;%Html.RenderPartial("~/Areas/Comm/Views/Shared/LogOnUserControl.ascx");%&amp;gt;&lt;/p&gt; &lt;p&gt;&lt;span style="word-spacing: 0px; font: medium simsun; text-transform: none; color: #000000; text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2;"&gt; &lt;span style="font-size: 12px; color: #222222; line-height: 19px; font-family: 'Trebuchet Ms',Arial,Helvetica,sans-serif;"&gt; 注意：用第一种方法时，用户控件必须&lt;span style="word-spacing: 0px; font: medium simsun; text-transform: none; color: #000000; text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2;"&gt;&lt;span style="font-size: 14px; line-height: 25px; font-family: 宋体,Arial,Helvetica,sans-serif;"&gt;放在调用者同一目录下，也可以放在View/Shared中。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;wbr&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="word-spacing: 0px; font: medium simsun; text-transform: none; color: #000000; text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2;"&gt; &lt;span style="font-size: 12px; color: #222222; line-height: 19px; font-family: 'Trebuchet Ms',Arial,Helvetica,sans-serif;"&gt; &lt;span style="word-spacing: 0px; font: medium simsun; text-transform: none; color: #000000; text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2;"&gt; &lt;span style="font-size: 14px; line-height: 25px; font-family: 宋体,Arial,Helvetica,sans-serif;"&gt; &amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt; Html.RenderAction则通过Controller中的Action来调用用户控件&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="word-spacing: 0px; font: medium simsun; text-transform: none; color: #000000; text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2;"&gt; &lt;span style="font-size: 12px; color: #222222; line-height: 19px; font-family: 'Trebuchet Ms',Arial,Helvetica,sans-serif;"&gt; &lt;span style="word-spacing: 0px; font: medium simsun; text-transform: none; color: #000000; text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2;"&gt; &lt;span style="font-size: 14px; line-height: 25px; font-family: 宋体,Arial,Helvetica,sans-serif;"&gt; Controller:----用户控件所在&lt;span style="word-spacing: 0px; font: medium simsun; text-transform: none; color: #000000; text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2;"&gt;&lt;span style="font-size: 12px; color: #222222; line-height: 19px; font-family: 'Trebuchet Ms',Arial,Helvetica,sans-serif;"&gt;&lt;span style="word-spacing: 0px; font: medium simsun; text-transform: none; color: #000000; text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2;"&gt;&lt;span style="font-size: 14px; line-height: 25px; font-family: 宋体,Arial,Helvetica,sans-serif;"&gt;Controller&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="word-spacing: 0px; font: medium simsun; text-transform: none; color: #000000; text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2;"&gt; &lt;span style="font-size: 12px; color: #222222; line-height: 19px; font-family: 'Trebuchet Ms',Arial,Helvetica,sans-serif;"&gt; &lt;span style="word-spacing: 0px; font: medium simsun; text-transform: none; color: #000000; text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2;"&gt; &lt;span style="font-size: 14px; line-height: 25px; font-family: 宋体,Arial,Helvetica,sans-serif;"&gt; &amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt; public ActionResult UserControl()&lt;br /&gt; &amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;{&lt;br /&gt;  &amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;return PartialView();&lt;br /&gt; &amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="word-spacing: 0px; font: medium simsun; text-transform: none; color: #000000; text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2;"&gt; &lt;span style="font-size: 12px; color: #222222; line-height: 19px; font-family: 'Trebuchet Ms',Arial,Helvetica,sans-serif;"&gt; &lt;span style="word-spacing: 0px; font: medium simsun; text-transform: none; color: #000000; text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2;"&gt; &lt;span style="font-size: 14px; line-height: 25px; font-family: 宋体,Arial,Helvetica,sans-serif;"&gt; View:----调用用户控件的View&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="word-spacing: 0px; font: medium simsun; text-transform: none; color: #000000; text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2;"&gt; &lt;span style="font-size: 12px; color: #222222; line-height: 19px; font-family: 'Trebuchet Ms',Arial,Helvetica,sans-serif;"&gt; &lt;span style="word-spacing: 0px; font: medium simsun; text-transform: none; color: #000000; text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2;"&gt; &lt;span style="font-size: 14px; line-height: 25px; font-family: 宋体,Arial,Helvetica,sans-serif;"&gt; &amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt;&amp;nbsp;&lt;wbr&gt; &amp;lt;%Html.RenderAction("UserControl","Controller");%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;							 		&lt;/div&gt;&lt;/div&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/rickie/aggbug/2021618.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/rickie/archive/2011/04/19/2021618.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/rickie/archive/2011/03/31/2001505.html</id><title type="text">Setting Expires and Cache-Control: max-age headers for static resources in ASP.NET</title><summary type="text">Setting Expires and Cache-Control: max-age headers for static resources in ASP.NET原文地址： http://www.stardeveloper.com/articles/expires-and-max-age-headers-in-aspnet/Real-World example of load time improvement using HTTP static resource caching原文地址： http://www.stardeveloper.com/articles/real-world-exa</summary><published>2011-03-31T13:13:00Z</published><updated>2011-03-31T13:13:00Z</updated><author><name>Rickie</name><uri>http://www.cnblogs.com/rickie/</uri></author><link rel="alternate" href="http://www.cnblogs.com/rickie/archive/2011/03/31/2001505.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/rickie/archive/2011/03/31/2001505.html"/><content type="html">&lt;div&gt;&amp;nbsp;Setting Expires and Cache-Control: max-age headers for static resources in ASP.NET&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;原文地址： &lt;br /&gt;&lt;/p&gt;&lt;p&gt;http://www.stardeveloper.com/articles/expires-and-max-age-headers-in-aspnet/&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;div&gt;Real-World example of load time improvement using HTTP static resource caching&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;原文地址： &lt;br /&gt;&lt;/p&gt;&lt;div&gt;http://www.stardeveloper.com/articles/real-world-example-of-load-time-improvement-after-using-static-resource-caching/&lt;/div&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/rickie/aggbug/2001505.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/rickie/archive/2011/03/31/2001505.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/rickie/archive/2011/03/25/1994997.html</id><title type="text">改善用户体验 Web前端优化策略总结</title><summary type="text">前端是庞大的，包括HTML、CSS、Javascript、Image、Flash等等各种各样的资源。前端优化是复杂的，针对方方面面的资源都有不同的方式。那么，前端优化的目的是什么？1. 从用户角度而言，优化能够让页面加载得更快、对用户的操作响应得更及时，能够给用户提供更为友好的体验。2. 从服务商角度而言，优化能够减少页面请求数、或者减小请求所占带宽，能够节省可观的资源。总之，恰当的优化不仅能够改善站点的用户体验并且能够节省相当的资源利用。前端优化的途径有很多，按粒度大致可以分为两类，第一类是页面级别的优 化，例如HTTP请求数、脚本的无阻塞加载、内联脚本的位置优化等；第二类则是代码级别的优化</summary><published>2011-03-25T00:16:00Z</published><updated>2011-03-25T00:16:00Z</updated><author><name>Rickie</name><uri>http://www.cnblogs.com/rickie/</uri></author><link rel="alternate" href="http://www.cnblogs.com/rickie/archive/2011/03/25/1994997.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/rickie/archive/2011/03/25/1994997.html"/><content type="html">&lt;div&gt;&lt;p&gt;前端是庞大的，包括HTML、CSS、Javascript、Image、Flash等等各种各样的资源。前端优化是复杂的，针对方方面面的资源都有不同的方式。那么，前端优化的目的是什么？&lt;span style="font-family: 黑体;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;1. 从用户角度而言，优化能够让页面加载得更快、对用户的操作响应得更及时，能够给用户提供更为友好的体验。&lt;/p&gt;&lt;p&gt;2. 从服务商角度而言，优化能够减少页面请求数、或者减小请求所占带宽，能够节省可观的资源。&lt;/p&gt;&lt;p&gt;总之，恰当的优化不仅能够改善站点的用户体验并且能够节省相当的资源利用。前端优化的途径有很多，按粒度大致可以分为两类，第一类是页面级别的优 化，例如HTTP请求数、脚本的无阻塞加载、内联脚本的位置优化等；第二类则是代码级别的优化，例如Javascript中的DOM操作优化、CSS选择 符优化、图片优化以及HTML结构优化等等。另外，本着提高投入产出比的目的，后文提到的各种优化策略大致按照投入产出比从大到小的顺序排列。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;一、页面级优化&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1. 减少HTTP请求数&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这条策略基本上所有前端人都知道，而且也是最重要最有效的。都说要减少HTTP请求，那请求多了到底会怎么样呢？首先，每个请求都是有成本的，既包 含时间成本也包含资源成本。一个完整的请求都需要经过DNS寻址、与服务器建立连接、发送数据、等待服务器响应、接收数据这样一个&amp;#8220;漫长&amp;#8221;而复杂的过程。 时间成本就是用户需要看到或者&amp;#8220;感受&amp;#8221;到这个资源是必须要等待这个过程结束的，资源上由于每个请求都需要携带数据，因此每个请求都需要占用带宽。&lt;/p&gt;&lt;p&gt;另外，由于浏览器进行并发请求的请求数是有上限的(具体参见此处)，因此请求数多了以后，浏览器需要分批进行请求，因此会增加用户的等待时间，会给 用户造成站点速度慢这样一个印象，即使可能用户能看到的第一屏的资源都已经请求完了，但是浏览器的进度条会一直存在。减少HTTP请求数的主要途径包括：&lt;/p&gt;&lt;p&gt;(1). 从设计实现层面简化页面&lt;/p&gt;&lt;p&gt;如果你的页面像百度首页一样简单，那么接下来的规则基本上都用不着了。保持页面简洁、减少资源的使用时最直接的。如果不是这样，你的页面需要华丽的皮肤，则继续阅读下面的内容。&lt;/p&gt;&lt;p&gt;(2). 合理设置HTTP缓存&lt;/p&gt;&lt;p&gt;缓存的力量是强大的，恰当的缓存设置可以大大的减少HTTP请求。以有啊首页为例，当浏览器没有缓存的时候访问一共会发出78个请求，共600多K 数据（如图1.1），而当第二次访问即浏览器已缓存之后访问则仅有10个请求，共20多K数据（如图1.2）。（这里需要说明的是，如果直接F5刷新页面 的话效果是不一样的，这种情况下请求数还是一样，不过被缓存资源的请求服务器是304响应，只有Header没有Body，可以节省带宽）&lt;/p&gt;&lt;p&gt;怎样才算合理设置？原则很简单，能缓存越多越好，能缓存越久越好。例如，很少变化的图片资源可以直接通过HTTP  Header中的Expires设置一个很长的过期头；变化不频繁而又可能会变的资源可以使用Last-Modifed来做请求验证。尽可能的让资源能够 在缓存中待得更久。&lt;/p&gt;&lt;p&gt;(3). 资源合并与压缩&lt;/p&gt;&lt;p&gt;如果可以的话，尽可能的将外部的脚本、样式进行合并，多个合为一个。另外，CSS、Javascript、Image都可以用相应的工具进行压缩，压缩后往往能省下不少空间。&lt;/p&gt;&lt;p&gt;(4). CSS Sprites&lt;/p&gt;&lt;p&gt;合并CSS图片，减少请求数的又一个好办法。&lt;/p&gt;&lt;p&gt;(5). Inline Images&lt;/p&gt;&lt;p&gt;使用data: URL scheme的方式将图片嵌入到页面或CSS中，如果不考虑资源管理上的问题的话，不失为一个好办法。如果是嵌入页面的话换来的是增大了页面的体积，而且无法利用浏览器缓存。使用在CSS中的图片则更为理想一些。&lt;/p&gt;&lt;p&gt;(6). Lazy Load Images&lt;/p&gt;&lt;p&gt;这条策略实际上并不一定能减少HTTP请求数，但是却能在某些条件下或者页面刚加载时减少HTTP请求数。对于图片而言，在页面刚加载的时候可以只 加载第一屏，当用户继续往后滚屏的时候才加载后续的图片。这样一来，假如用户只对第一屏的内容感兴趣时，那剩余的图片请求就都节省了。有啊首页曾经的做法 是在加载的时候把第一屏之后的图片地址缓存在Textarea标签中，待用户往下滚屏的时候才&amp;#8220;惰性&amp;#8221;加载。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2. 将外部脚本置底&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;前文有谈到，浏览器是可以并发请求的，这一特点使得其能够更快的加载资源，然而外链脚本在加载时却会阻塞其他资源，例如在脚本加载完成之前，它后面 的图片、样式以及其他脚本都处于阻塞状态，直到脚本加载完成后才会开始加载。如果将脚本放在比较靠前的位置，则会影响整个页面的加载速度从而影响用户体 验。解决这一问题的方法有很多，在这里有比较详细的介绍（这里是译文和更详细的例子），而最简单可依赖的方法就是将脚本尽可能的往后挪，减少对并发下载的 影响。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3. 异步执行inline脚本&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;inline脚本对性能的影响与外部脚本相比，是有过之而无不及。首页，与外部脚本一样，inline脚本在执行的时候一样会阻塞并发请求，除此之 外，由于浏览器在页面处理方面是单线程的，当inline脚本在页面渲染之前执行时，页面的渲染工作则会被推迟。简而言之，inline脚本在执行的时 候，页面处于空白状态。鉴于以上两点原因，建议将执行时间较长的inline脚本异步执行，异步的方式有很多种，例如使用script元素的defer属 性（存在兼容性问题和其他一些问题，例如不能使用document.write）、使用setTimeout，此外，在HTML5中引入了Web  Workers的机制，恰恰可以解决此类问题。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4. Lazy Load Javascript&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;随着Javascript框架的流行，越来越多的站点也使用起了框架。不过，一个框架往往包括了很多的功能实现，这些功能并不是每一个页面都需要 的，如果下载了不需要的脚本则算得上是一种资源浪费-既浪费了带宽又浪费了执行花费的时间。目前的做法大概有两种，一种是为那些流量特别大的页面专门定制 一个专用的mini版框架，另一种则是Lazy  Load。YUI则使用了第二种方式，在YUI的实现中，最初只加载核心模块，其他模块可以等到需要使用的时候才加载。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;5. 将CSS放在HEAD中&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果将CSS放在其他地方比如BODY中，则浏览器有可能还未下载和解析到CSS就已经开始渲染页面了，这就导致页面由无CSS状态跳转到CSS状 态，用户体验比较糟糕。除此之外，有些浏览器会在CSS下载完成后才开始渲染页面，如果CSS放在靠下的位置则会导致浏览器将渲染时间推迟。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;6. 异步请求Callback&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在某些页面中可能存在这样一种需求，需要使用script标签来异步的请求数据。类似：&lt;/p&gt;&lt;pre&gt;&lt;ol&gt;&lt;li&gt;&lt;span&gt;Javascript: &amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;/*Callback函数*/ &amp;nbsp;&lt;/li&gt;&lt;li&gt;function&amp;nbsp;myCallback(info){ &amp;nbsp;&lt;/li&gt;&lt;li&gt;//do&amp;nbsp;something&amp;nbsp;here &amp;nbsp;&lt;/li&gt;&lt;li&gt;} &amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;HTML: &amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;lt;script&amp;nbsp;type="text/javascript"&amp;nbsp;src="http://abc.com/cb"&amp;gt;&amp;lt;/script&amp;gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;cb返回的内容: &amp;nbsp;&lt;/li&gt;&lt;li&gt;myCallback('Hello&amp;nbsp;world!');&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;p&gt;像以上这种方式直接在页面上写&amp;lt;script&amp;gt;对页面的性能也是有影响的，即增加了页面首次加载的负担，推迟了DOMLoaded和 window.onload事件的触发时机。如果时效性允许的话，可以考虑在DOMLoaded事件触发的时候加载，或者使用setTimeout方式来 灵活的控制加载的时机。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;7. 减少不必要的HTTP跳转&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;对于以目录形式访问的HTTP链接，很多人都会忽略链接最后是否带&amp;#8217;/'，假如你的服务器对此是区别对待的话，那么你也需要注意，这其中很可能隐藏了301跳转，增加了多余请求。具体参见下图，其中第一个链接是以无&amp;#8217;/'结尾的方式访问的，于是服务器有了一次跳转。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;8. 避免重复的资源请求&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这种情况主要是由于疏忽或页面由多个模块拼接而成，然后每个模块中请求了同样的资源时，会导致资源的重复请求。出现的几率不大，但是还是要注意排查，不然可能会出现如下局面，来自这里。&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/rickie/aggbug/1994997.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/rickie/archive/2011/03/25/1994997.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/rickie/archive/2011/03/22/1991904.html</id><title type="text">ASP.NET Open Source Projects</title><summary type="text">ASP.NET Open Source Projectshttp://wiki.asp.net/page.aspx/388/aspnet-open-source-projects/有大量基于.NET Framework 开发的开源项目。 另外还推荐几个开源的ASP.NET MVC 项目：（1）Orchard 项目 http://orchard.codeplex.com/（2）The Beer House CMS and E-Commerce applicationhttp://thebeerhouse.codeplex.com/（3）mytrip.mvc 项目http://mytripmvc.</summary><published>2011-03-22T14:09:00Z</published><updated>2011-03-22T14:09:00Z</updated><author><name>Rickie</name><uri>http://www.cnblogs.com/rickie/</uri></author><link rel="alternate" href="http://www.cnblogs.com/rickie/archive/2011/03/22/1991904.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/rickie/archive/2011/03/22/1991904.html"/><content type="html">&lt;div&gt;ASP.NET Open Source Projects&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;http://wiki.asp.net/page.aspx/388/aspnet-open-source-projects/&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;有大量基于.NET Framework 开发的开源项目。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.cnblogs.com/Emoticons/others/look001.gif" alt="" /&gt; &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;另外还推荐几个开源的ASP.NET MVC 项目：&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;（1）Orchard 项目 &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;div&gt;&lt;div&gt;http://orchard.codeplex.com/&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;（2）The &lt;a href="http://thebeerhouse.codeplex.com/" rel="nofollow"&gt;Beer House CMS&lt;/a&gt; and E-Commerce application&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;div&gt;http://thebeerhouse.codeplex.com/&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;（3）mytrip.mvc 项目&lt;/p&gt;&lt;p&gt;&lt;div&gt;http://mytripmvc.net/&lt;/div&gt;&amp;nbsp;&lt;/p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/rickie/aggbug/1991904.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/rickie/archive/2011/03/22/1991904.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
