ASP.NET框架应用程序实战:软件开发工程师岗前必备
上QQ阅读APP看书,第一时间看更新

2.2 认识ASP.NET MVC

2.2.1 ASP.NET MVC概述

MVC设计模式已经流行多年,而且MVC设计模式在大型的Web应用系统中已经逐渐成为必须采用的架构。但ASP.NET最开始的几个版本并没有提供支持MVC设计模式的框架,而程序员自己开发MVC架构则比较困难,因此迫切要求微软能够推出支持ASP.NET的MVC框架。

直到2007年年末,可用于ASP.NET的MVC框架只有开源框架MonoRail。从2000年开始,Struts就成为Java平台上用于MVC的框架。PHP更是拥有十几种MVC框架。RubyonRails平台本身就自带了默认的MVC架构功能,并且其中包含了text/unit库,用于整合单元测试功能。

在VisualStudio2002和VisualStudio2003中,VisualStudio开发小组仍然没有为这个IDE提供单元测试功能和重构特性。终于在VisualStudio2005的测试版中,单元测试功能(MSTest)被整合到这个IDE中,但是,在微软发布的VisualStudio2008和ASP.NTE3.5中并没有提供对MVC的支持。

2008年3月,微软发布了ASP.NET MVC预览版2,在这个预览版中提供了MVC routing,并对测试功能进行了改进,这个版本才是真正意义上的ASP.NET MVC框架。

2009年3月,ASP.NET MVC1被正式发布出来,包括代码和测试单元。

2010年3月,ASP.NET MVC2正式版发布。

2011年1月,ASP.NET MVC3正式版发布。

目前,ASP.NET MVC4已内置于VisualStudio2012中;ASP.NET MVC5已内置于VisualStudio2013中。本文将以VisualStudio2013内置的ASP.NET MVC5框架为例讲解相关功能的使用方法。新版本ASP.NET MVC新增了手机模板、单页应用程序、WebAPI等模板,更新了一些JavaScript库,其中示例页面也使用了JQuery的AJAX登录,并增加了对OAuth认证EntityFramework5的支持。同时也増强了对HTML5、AsyncController等的支持。

ASP.NET MVC框架为创建基于MVC设计模式的Web应用程序提供了设计框架和技术基础。它是轻量级的、高度可测试的演示框架,并且它结合了现有的ASP.NET特性(如母版页等)。MVC框架被定义在Sytem.Web.Mvc命名空间中,并且是被Sytem.Web命名空间所支持的。

ASP.NET MVC框架具有如下特性:

(1)APS.NET MVC框架深度整合了许多用户熟悉的平台特性,如运行时、身份验证、安全性、缓存和配置特性等。

(2)APS.NET MVC框架是基于标准组件的,开发人员可以根据需要分解和替换每个组件。

(3)APS.NET MVC框架使用用户熟悉的ASPX和CSHTML文件进行开发,然后在运行时生成HTML标签。

(4)APS.NET MVC框架中,URL将不再映射到ASPX文件中,而是映射到一些控制器类(Controller)。所谓控制器类,是一些不包括UI组件的标准类。

(5)APS.NET MVC框架实现了System.Web.IHttpRequest和IHttpResponse接口。

(6)在测试时,不必再通过Web请求,单元测试可以撇开控制器直接进行测试。

(7)在没有ASP.NET运行环境的机器上可进行单元测试。

2.2.2 MVC的优点

(1)可以为模型在运行时建立和使用多个视图。变化和传播机制可以确保所有相关的视图及时得到模型数据的变化,从而使所有关联的视图和控制器做到行为同步。

(2)视图与控制的可接插性,允许更换视图和控制器对象,而且可以根据需求动态地打开或关闭,甚至在运行期间进行对象替换。

(3)模型的可移植性。因为模型是独立于视图的,所以可以把模型独立地移植到新的平台上工作,需要做的只是在新平台上对视图和控制器进行修改。

(4)潜在的框架结构。可以基于此模型建立应用程序框架,而不仅是在界面的设计中。

2.2.3 MVC5的新特性

MVC5版在相当成熟的基础上,能够把重点放在一些更高级的场景。MVC5的新特性包括如下方面:

(1)ASP.NET WebAPI

(2)EnhancementstoDefaultProjectTemplates(增强了默认的项目模板)

(3)MobileProject Template UsingJQuery Mobile(JQuery Mobile的移动项目模板)

(4)Display Modes(显示模式)

(5)Bundlingand Minification(打包和压缩)

(6)TaskSupportforAsynchronousControllers(任务支持异步控制器)

(7)MiscellaneousFeatures(其他特性)

1.ASP.NET WebAPI

MVC4包括一个更好的解决方案为ASP.NET Web API,该框架提供ASP.NET MVC的开发风格,是专为编写HTTP服务而设计的。这包括提供HTTP的服务领域和提供一些新的面向服务的功能,包括路由、模型绑定和验证、过滤器、脚手架(Scaffolding)、简易装置可测性等。

虽然ASP.NET的WebAPI包含了MVC5的功能,但它可以被单独使用。事实上,它没有依赖于ASP.NET,并且可以自托管,那就是外托管ASP.NET和IIS。这意味着可以运行WebAPI.NET应用程序,包括Windows服务或一个简单的控制台应用程序。

2.EnhancementstoDefaultProjectTemplates

新的MVC提供了丰富的项目模板供开发者选择,用于满足不同的开发场景。

(1)空模板

空模板用于创建ASP.NET MVC5网站的架构,包含基本的文件夹结构,以及需要引用的ASP.NET MVC程序集,也包含可能要使用的JavaScript库。模板包含默认的视图布局,以及标准配置代码的Global.asax文件。绝大部分ASP.NET MVC应用程序都会用到这些代码。

(2)基本模板

基本按照ASP.NET MVC5的规则创建文件夹结构,包含ASP.NET MVC程序集的引用。这些模板表明了创建ASP.NET MVC5项目所需要的最低标准的资源。现在我们可以从这个项目开始进行开发工作了。

(3)互联网应用程序模板

互联网应用程序(InternetApplication)模板源于空模板,对它进行了扩展,包含简单的默认控制器(HomeController)、账户控制器(AccountController)。账户控制器包含用户注册和登录网站所需要的基本逻辑代码,以及这两个控制器需要的默认视图文件。

(4)以太网应用程序模饭

以太网应用程序(IntranetApplication)模板与互联网应用程序模板十分相似,使用了基于Windows的验证机制,这也是企业局域网安全验证的首选机制。

(5)移动应用程序模饭

移动应用程序模板(Mobile Application Template)是互联网应用程序(Internet Application)模板的一个变种。这个模板针对移动设备进行了优化,而且包含了JQuery MobileJavaScript框架以及与JQuery Mobile完美兼容的视图模板。

(6)WebAPI

WebAPI模板是互联网应用程序模板的变种,它预定义了WebAPI控制器。Web API是一种新的轻量级的RestfulHTTP Web服务框架,可以与ASP.NetMVC无缝集成。WebAPI是创建支持AJAX交互数据服务的首选,可以非常方便地用于创建这种轻量级服务。

3.MobileProjectTemplateUsingJQueryMobile

开发时可以使用新的移动项目模板。此模板预配置相关网站使用流行的JQuery手机库,在功能上支持JQuery Mobile的触摸优化、AJAX导航和采用逐行支持移动设备的增强功能。

4.DisplayModes

随着移动设备数量的增长,普通用户要求使用移动终端在互联网上冲浪、访问不同的网站,所以我们必须做好准备。大部分情况下,移动设备上的数据显示模式与传统的PC桌面上的应用一样,除了一些特定的专为移动设备设计的图形元素以外。ASP.Net MVC显示模式提供了更便捷的针对不同移动设备的显示方式。

显示模式提供了一个约定的方法用于处理不同浏览器上发出的请求。默认视图引擎将首先查找名称以.Mobile.cshtml结尾的浏览器用户代理文件,获取相关的移动设备并进行处理。此外,你还可以注册自己的自定义设备模式,这仅仅只需要一句代码。例如,要注册一个WinPhone设备模式,在项目的global.asax文件中的Application_Startmethod事件中可以使用下面的代码:

        DisplayModeProvider.Instance.Modes.Insert(0, new DefaultDisplayMode("WinPhone")
        {
            ContextCondition =(context=>
                context.GetOverriddenUserAgent()
                .IndexOf ("Windows Phone OS",
                StringComparison.OrdinalIgnoreCase) >=0)
        });

5.Bundlingand Minification

尽管现在可以通过更快的网速访问互联网,但是这并不意味着可以随意开发网站而忽略客户端体验。事实上,只有完全了解了各种资源的下载过程以及耗费的琐碎时间,才能理解这些问题对网速的负面影响。JavaScripr、CSS合并以及压缩或许已经不算是新鲜的概念了,但是仍然非常有用,况且.NET Framework4.5已经正式发布,现已成为整个ASP.NET框架的基础。更确切地说,ASP.NET MVC封装和扩展了NET框架的核心功能,以便于我们在ASP.NET MVC开发中更加方便地使用这些功能。

MVC4提供的打包和缩小功能,可以删除视图文件中引用的多余代码,这意味着你可以添加或升级脚本库和CSS文件,不需要对单个引用文件做替换升级处理,只需要添加和如下代码类似的绑定包,而且此方式的表达还不会依赖于引用文件的版本号:

        bundles.Add(new ScriptBundle("~/bundles/jquery").Include("~/Scripts/jquery
        - {version}.js"));

在视图中使用Scripts.Render()方法可以调用打包后的资源路径,代码如下:

        @Scripts.Render("~/bundles/jquery")

由于这样的引用不依赖JQuery的版本号,当更新了JQuery库(无论是手动或通过NuGet)后,系统会自动将最新的版本文件进行打包和压缩,无须进行任何代码的更改。

6.TaskSupportforAsynchronousControllers

IlS会使用新线程来处理每个请求,所以每个新请求与IIS的有限可用线程息息相关,甚至包括那些空闲的线程(例如,等待数据库查询或者Web服务返回结果的线程)。在.NET框架4.0和IIS7中已经大幅增加了默认线程池的线程数量。尽量避免长时间独占资源仍然是最好的实战开发原则。为了更好地处理这种耗时很长的请求,ASP. NET MVC5.0引入了异步控制器机制,通过使用异步控制器,就可以告诉框架释放处理长请求的线程,在等待期间优先去完成其他的任务。一旦这些临时任务结束,ASP.NET MVC框架就会让此线程返回到之前的请求任务。只要异步控制能正常执行完成,一样会返回结果,只是现在可以同时处理更多的请求。

7.MiscellaneousFeatures

MVC包括了很多以前没有列出的功能的完整列表,可在http://www.asp.net/whitepapers/mvc4-release-notes中看到。

(1)配置的逻辑移到App_Start目录中:这使得Global.asax文件中通过代码配置导致逻辑混乱的局面已不复存在。App_Start目录包括的类文件功能描述如下。

AuthConfig.cs:配置安全设置,包括网站的OAuth登录。

BundleConfig.cs:用于注册所使用的打包和压缩的资源。默认情况下,包括JQuery、JQuery验证、JQueryUI、Modernizr和CSS引用。

FilterConfig.cs:注册全局的MVC过滤器。

RouteConfig.cs:持有的原始MVC的配置语句,可以配置路由。

WebApiConfig.cs:用于注册WebAPI,以及其他WebAPI的配置。

(2)可在任何地方添加控制器:在此之前,在VisualStudio添加控制器只能右击控制器文件夹,新创建控制器文件也只能存放到控制器文件夹中。然而,MVC5将识别所有类,只要实现IController接口后即可作为控制器类,无论它的位置在应用程序的什么地方。MVC5工具已被修改为在任何文件夹中均可显示“添加控制器”菜单项,这允许用户灵活组织控制器。

2.2.4 MVC程序的运行原理

MVC应用程序在运行时将会按照一定的路由规则访问项目资源,MVC在运行时处理请求的过程如图2-2所示。

图2-2 MVC处理请求的过程