《精通 ASP.NET MVC 4》----1.3 ASP.NET MVC的关键优点

简介: ASP.NET已经获得了巨大的商业成功,但正如所讨论的,其他Web开发领域也在进步,即使是微软也在不断清理Web Form的垢病,因为其基本设计看上去已经相当陈旧了。

本节书摘来自异步社区《精通 ASP.NET MVC 4》一书中的第1章,第1.3节,作者: 【美】Adam Freeman ,译者: 李萍 , 徐燕萍 , 林逸 , 更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.3 ASP.NET MVC的关键优点

精通 ASP.NET MVC 4
ASP.NET已经获得了巨大的商业成功,但正如所讨论的,其他Web开发领域也在进步,即使是微软也在不断清理Web Form的垢病,因为其基本设计看上去已经相当陈旧了。

2007年10月,在德克萨斯-奥斯汀举行的第一次ALT.NET国际会议上,微软副总裁ScottGuthrie宣布并演示了崭新的MVC Web开发平台,它建立在核心ASP.NET平台之上,明确地作出对Rails等技术进展的直接回应,以及对Web Form批评的反应。以下小节将描述这个新平台如何克服Web Form的局限性,并把ASP.NET重新带回到先进行列。

1.3.1 MVC的体系结构

区别MVC体系结构模式与ASP.NET MVC框架非常重要。MVC模式并不新——这要回溯到1978年Xerox PARC的Smalltalk项目——但它作为一种Web应用程序的模式,如今已得到了广泛的普及,原因如下。

用户与MVC应用程序的交互遵循一种自然的循环:用户采取一个动作,应用程序对其作出响应,修改其数据模型,并把一个更新的视图提供给该用户,然后重复这一循环。这非常适合于以一系列HTTP请求与响应进行传递的Web应用程序。

Web应用程序必须组合多种技术(如数据库、HTML、可执行代码等),这通常被分成一系列层次。这种组合所产生的设计模式能够自然地映射到MVC的概念上。

ASP.NET MVC框架实现了这种MVC模式,而且在实现过程中还极大地改善了关注分离。事实上,ASP.NET MVC实现了MVC模式的现代化变异,使它特别适用于Web应用程序。读者将在第3章更多地了解这种体系结构的理论与做法。

通过采纳和调整MVC模式,ASP.NET MVC框架对Roby on Rails以及类似平台形成了强有力的竞争,并把MVC模式带到了.NET世界的主流。利用开发人员使用其他平台的经验和最佳实践,ASP.NET MVC在许多方面的推进甚至已经超越了Rails。

1.3.2 可扩展性

桌面电脑的内部组件是一个个独立的部件,它们只通过标准的公共文档接口进行交互。人们可以很容易地拔出显卡或硬盘,并用另一制造商的产品来替换,相信它会在插槽中正常工作。MVC框架也被构建成一系列独立的组件——满足一个.NET接口,或建立在一个抽象类之上。因此,开发者可以很容易地用一个自己的不同实现来替换相应组件,如:替换路由系统、视图引擎、控制器工厂等。

ASP.NET MVC设计者对每一个MVC框架组件都提供了3种选择。

使用组件现行的默认实现(它应该足以满足大多数应用程序)。

派生默认实现的一个子类,以调整其行为。

用接口或抽象基类的一个新实现来完全替换该组件。

这就像自ASP.NET 2.0开始的提供器模型一样,而且还向前跨了一大步——深入到了MVC框架的核心部分。从第12章开始,读者将了解所有这些各种各样的组件,以及如何和为什么要调整或替换这些组件。

1.3.3 在HTML及HTTP上的严密控制

ASP.NET MVC认识到,产生整洁、与标准兼容的标记的重要性。其内建的HTML辅助器方法可以产生与标准兼容的输出,但与Web Form相比,还有一种更重要的理念上的变革。MVC框架鼓励使用构思简单、优雅、可设置CSS样式的标记,而不是生成大片难以控制的HTML标记。

当然,如果用户确实想将一些现成的部件用于复杂的UI元素,如日期选择器或级联菜单等,ASP.NET MVC的“无特殊需求”标记方法可以很容易地使用最佳品种的UI库,如jQuery库或Yahoo UI库等。微软已经将jQuery装配为默认的ASP.NET MVC项目模板的一个内建部件,ASP.NET MVC与流行的jQuery库啮合得如此良好,甚至能够直接引用微软的内容分发网络(CDN,Content Delivery Network)服务器上的jQuery.js文件。JavaScript开发者们如果了解到这些,一定会感到非常开心。

ASP.NET MVC生成的页面不含任何视图状态数据,因此,这些网页可能比典型的ASP.NET Web Form页面要小几百KB。无论今天的高速宽带如何,这种对带宽的节约仍然极大地改善了最终用户的体验。

与Ruby on Rails一样,ASP.NET MVC与HTTP工作得十分协调。用户对传递于浏览器与服务器之间的请求有完全的控制,因此只要用户愿意,就可以仔细地调整用户体验。AJAX很容易使用,而且没有任何自动回发来扰乱客户端状态。任何一个专注于Web的开发人员都会觉得这是极大的解放,且让人工作时心情愉快。

1.3.4 可测试性

MVC体系结构为用户提供了很棒的起点,以使应用程序可维护和可测试,因为用户可以自然地把应用程序的不同关注分成不同的、独立的软件片段。ASP.NET MVC的设计者们还不止做了这些。为了支持单元测试,他们对该框架采取了面向组件的设计,并确保把每个独立的片段构造成满足单元测试和模仿工具的需求。

添加了Visual Studio向导,让用户创建初步的单元测试项目,该项目集成了开源的单元测试工具,如NUnit和xUnit,以及微软自己的MSTest。即使以前从未编写过单元测试的人,也会有一个很好的开始。

读者将会在本书中看到,如何为ASP.NET MVC的控制器以及动作编写整洁、简单的单元测试示例。这些单元测试使用各种测试和模仿策略,提供对框架组件的伪造或模仿实现来模拟各种情景。

可测试性并不仅仅是单元测试的事情。ASP.NET MVC应用程序也可以与UI自动化测试工具良好协作。用户可以编写模拟用户交互的脚本,而不必猜测框架会生成什么样的HTML元素结构、什么样的CSS的class,或什么样的ID等,也不必担忧这种结构的意外变化。

1.3.5 强大的路由系统

随着Web应用程序技术的改进,URL的样式也已经发生了演变,如下面所示的URL。

/App_v2/User/Page.aspx?action=show%20prop&prop_id=82742
这种URL已经明显很少见到了,取而代之的是一种更简单、更清晰的格式,如下所示。

/to-rent/chicago/2303-silver-street
采用这种URL结构有一些很好的理由。首先,搜索引擎对URL中找到的关键词有明显的权重。一个对“芝加哥租房”的搜索,更可能找到的是一个较简单的URL。其次,许多Web用户现在对URL有了足够的领悟,并且乐于直接在浏览器的地址栏中输入。再次,当理解了URL的结构时,人们才会更可能链接它,与朋友共享它,或在电话中报读它。最后,这种URL并不会把应用程序的技术细节、文件夹、文件名结构暴露给整个公用网,因此,人们可以自由地修改底层实现而不会破坏输入链接。

整洁的URL在早期的框架中难以实现,但ASP.NET MVC会默认使用System.Web.Routing工具给出整洁的URL。这让用户能够完全控制URL方案及其与应用程序的关系,使用户能自由地创建对用户有意义和有用的URL模式,而无须遵守预定义模式。当然,这也意味着,如果用户愿意,可以很容易地定义现代REST风格的URL方案。读者将在第13章和第14章了解路由的整个处理和URL的最佳做法。

1.3.6 建立在ASP.NET平台的精华之上

微软当前的ASP.NET平台为开发高效的Web应用程序提供了一系列成熟的、经充分验证的组件和工具集。

首先,也是最明显的,由于ASP.NET MVC是基于.NET平台的,因此可以灵活地使用任何.NET语言来编写代码,并访问同样的API特性——不仅仅是MVC本身的特性,而是广泛的.NET类库和大量的第三方.NET类库体系。

其次,已形成的ASP.NET平台特性,如母版页(Master Page)、表单认证(Forms Authentication)、成员(Membership)、角色(Roles)、简档(Profiles),以及国际化(Internationalization)等,可以减少开发和维护Web应用程序所需的代码量。而且这些特性在MVC框架中的使用同在经典的Web Form项目中的使用一样有效。用户可以在ASP.NET MVC应用程序中重用Web Form内建的服务器控件,以及早期的ASP.NET项目中的自定义控件(只要它们不依赖于Web Form的专有概念,如视图状态)。

1.3.7 现代API

自2002年初以来,微软的.NET平台经过了不懈的演变,现在,在许多方面的支持甚至定义了达到最新技术发展水平的现代编程。

ASP.NET MVC 4是针对.NET 4.5而建立的,因此它的API可以充分利用最新语言和运行时的创新,包括await关键字、扩展方法、lambda表达式、匿名及动态类型,以及语言集成查询(LINQ)等。许多MVC框架的API方法和编码模式与早期平台相比,遵循了一种更清晰、更富表现力的写作方式。

1.3.8 ASP.NET MVC是开源的

与之前的微软Web开发平台不同,现在人们可以自由地下载ASP.NET MVC的源代码,甚至修改和编译自己的版本。在调试跟踪深入到系统组件,以及想步入其代码内部(甚至读取原程序员的注释)时,这种开源都是无价的。如果正在建立高级组件,并想看看有什么(可进一步)开发的可能性,或者想了解内建组件如何工作等情况时,这种开源也是很有用的。

此外,如果不喜欢框架的某些工作方式,或发现了一个bug,或者想访问一些不能访问的东西,这种开源简直太好了,因为人们可以自己作一些简单修改。然而,需要对这些修改保持跟踪,并且在更新到框架的新版本时,把它们重新运用起来。ASP.NET MVC开源工作在微软公共许可(Ms-PL,Microsoft Public License)之下(www.opensource.org/licenses/ms-pl.html),这是一个开放源代码倡议(OSI,Open Source Initiative)核准的开源许可协议。意思是,你可以修改源码、部署它,甚至把你的修改公开作为派生项目重新分发。读者可以从http://aspnet.codeplex.com/网站上下载MVC源代码。

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

相关文章
|
3月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
42 0
|
1月前
|
开发框架 前端开发 .NET
进入ASP .net mvc的世界
进入ASP .net mvc的世界
29 0
|
1月前
|
开发框架 中间件 .NET
C# .NET面试系列七:ASP.NET Core
## 第一部分:ASP.NET Core #### 1. 如何在 controller 中注入 service? 在.NET中,在ASP.NET Core应用程序中的Controller中注入服务通常使用<u>依赖注入(Dependency Injection)</u>来实现。以下是一些步骤,说明如何在Controller中注入服务: 1、创建服务 首先,确保你已经在应用程序中注册了服务。这通常在Startup.cs文件的ConfigureServices方法中完成。例如: ```c# services.AddScoped<IMyService, MyService>(); //
65 0
|
1月前
|
开发框架 前端开发 .NET
C# .NET面试系列六:ASP.NET MVC
<h2>ASP.NET MVC #### 1. MVC 中的 TempData\ViewBag\ViewData 区别? 在ASP.NET MVC中,TempData、ViewBag 和 ViewData 都是用于在控制器和视图之间传递数据的机制,但它们有一些区别。 <b>TempData:</b> 1、生命周期 ```c# TempData 的生命周期是短暂的,数据只在当前请求和下一次请求之间有效。一旦数据被读取,它就会被标记为已读,下一次请求时就会被清除。 ``` 2、用途 ```c# 主要用于在两个动作之间传递数据,例如在一个动作中设置 TempData,然后在重定向到另
100 5
|
3月前
|
开发框架 安全 搜索推荐
分享105个NET源码ASP源码,总有一款适合您
分享105个NET源码ASP源码,总有一款适合您
28 4
|
5月前
|
开发框架 自然语言处理 前端开发
基于ASP.NET MVC开发的、开源的个人博客系统
基于ASP.NET MVC开发的、开源的个人博客系统
52 0
|
1月前
mvc.net分页查询案例——mvc-paper.css
mvc.net分页查询案例——mvc-paper.css
5 0
|
3月前
|
XML 前端开发 定位技术
C#(NET Core3.1 MVC)生成站点地图(sitemap.xml)
C#(NET Core3.1 MVC)生成站点地图(sitemap.xml)
25 0
|
3月前
|
前端开发
.net core mvc获取IP地址和IP所在地(其实是百度的)
.net core mvc获取IP地址和IP所在地(其实是百度的)
124 0
|
8月前
|
存储 开发框架 前端开发
[回馈]ASP.NET Core MVC开发实战之商城系统(五)
经过一段时间的准备,新的一期【ASP.NET Core MVC开发实战之商城系统】已经开始,在之前的文章中,讲解了商城系统的整体功能设计,页面布局设计,环境搭建,系统配置,及首页【商品类型,banner条,友情链接,降价促销,新品爆款】,商品列表页面,商品详情等功能的开发,今天继续讲解购物车功能开发,仅供学习分享使用,如有不足之处,还请指正。
117 0