七天玩转 ASP.NET MVC 之深入理解 ASP.NET MVC

MVC 是用于构建 web 应用程序的一种框架,使用 MVC(Model View Controller) 设计:

  • Model (模型) : 表示应用程序的核心 (比如数据库记录列表)
  • View (视图) : 对数据 (数据库记录) 进行显示
  • Controller (控制器) 处理输入 (写入数据库记录)

MVC 模型同时提供对 HTML、CSS、以及Javascript 的完整控制。

MVC 模型通过三个逻辑层来定义 web 应用程序 :

  • business layer (业务层、模型逻辑)
  • display layer (显示层、视图逻辑)
  • input control (输入控件、控制器逻辑)

模型 :

模型是对应用程序中用于处理应用程序数据逻辑的部分。

通常模型对象在数据库中存取数据。

视图 :

视图是应用程序中处理数据显示的部分。

通常从模型数据中创建视图。

控制器 :

控制器是应用程序中处理用户交互的部分。

通常控制器从视图读取数据、控制用户输入,并向模型发送数据。

MVC 的这种拆分有助于我们管理复杂的应用程序,因为你能够在同一时间关注一个方面。例如,你可以在不依赖业务逻辑的情况下对视图进行设计,同时对应用程序的设计也更加容易。这种拆分同时简化了分组开发,不同开发人员可以同时开发视图、控制器逻辑和业务逻辑。

ASP.NET 支持三种开发模式 :

Web Pages、MVC、Web Forms

ASP.NET Web Forms

Web Forms 最主要的优势就是可视化编程,但是微软为什么还要推出ASP.NET MVC呢?主要是因为ASP.NET Webform的性能问题。在Web应用程序中从两个方面来定义性能 :

  1. 响应时间 : 服务器响应请求的耗时
  2. 带宽消耗 : 同时可传输多少数据

响应时间 :

在使用 Web Forms 时,每一次请求都有转换逻辑,运行并转换服务器控件为 HTML 输出。如果我们的页面使用表格,树形控件等复杂控件,转换就会变得很糟蹋并且很复杂。HTML 输出也是非常复杂的,由于这些不必要的转换从而增加了响应时间。该问题的解决方案就是摆脱后台代码,写成纯 HTML 代码。

带宽消耗 :

ASP.NET 开发人员都非常熟悉 Viewstates,因为它能够自动保存 post 返回的状态,减少开发时间。但是这种开发时间的减少会带来巨大的消耗,Viewstate增加了页面的大小。在做加载测试中,与 MVC 相比,我们发现 Viewstate增加了两倍的页面存储。以下是测试结果 :

页面尺寸的增加是因为 Viewstate 产生了额外的字节。

ASP.NET MVC :

后台代码和服务器控件是一切问题的根源。

ASP.NET MVC 请求流的通用步骤 :

  1. 首先获取控制器
  2. 依赖行为控制器创建Model对象,Model通过转换调用数据访问层
  3. 数据填充Model之后,传递到View显示层,实现显示的目的

ASP.NET MVC Controller :

控制器是 MVC 体系架构的核心部分。Controllers 文件夹包含负者处理用户输入和响应的控制器类。MVC 要求所有的控制器的名称都必须以 “Controller” 结尾。Web 服务器通常会将进入的 URL 请求直接映射到服务器上的磁盘文件。例如某个 : www.xx.com/index.php 将映射到服务器根目录上的文件 “index.php”。然而 MVC 框架的映射方式有所不同,MVC 将 URL 映射到方法,这些方法在类中被称为“控制器” 。控制器负者处理进入的请求。处理输入、保存数据,并把响应发送回客户端。

小栗子 :

运行 VS 依次 文件–>新建–>项目–>Web–>ASP.NET MVC应用程序,在 Controller 文件夹里添加一个 TestController (必须要有关键字 Controller)控制器,打开新建的TestController 类,可以看到已经生成了 Index方法,将该方法注释掉之后,写一个新方法,如下 :

在浏览器里打开 :

很显然的可以看到我们访问的是一个类中的方法,这个TestController类是一个控制器。

当然,我们也可以限制访问某个方法,如下 :

ASP.NET MVC View

Controller 是处理用户请求,并作出响应,通常情况下响应都是以显示贼气浏览器中,使用 HTML 代码,浏览器才可以识别。HTML 有图像,文本,输入控件等。通常称为用户界面的设计即 UI 层,在 ASP.NET MVC称为 View。Views 文件夹存储的是与应用程序显示 (用户界面) 相关的文件 (HTML 文件)。根据语言的不同,这些文件的扩展名可能是html、asp、aspx、cshtml 或 vbhtml。Views 文件夹包含每个控制器对应的一个文件夹。

Visual Web Developer 已经创建了一个 Account 文件夹、一个 Home 文件夹、一个 Shared 文件夹 (在 Views 文件夹内)。

Account 文件夹包含用于注册并登陆用户账号的页面。

Home 文件夹用于存储诸如首页和关于页之类的应用程序页面。

Shared 文件夹用于存储控制器间分享的视图 (模板页和布局页)。

小栗子 :

我们在 Test 控制器里新建一个 Action方法,并点击该方法右键添加 View,命名为MyView,取消选中的“使用布局”。可以在资源管理器中的 Views文件夹下的 Test文件夹下多出一个MyView视图。

如下 :

然后我们在该视图里写一段话并在浏览器里访问这个控制器对应的方法,如下 :

上面我们说过,Views 文件夹包含每个控制器对应的一个文件夹,而 View 是与放置在特定目录下的 Controller 相关。这个特定文件夹是以ControllerName命名的,所以我们新建的视图放在了Test文件夹下,而这个Test文件夹又放在Views文件夹下。

当然,多个控制器也可以重用 View ,不过我们需要把这些文件放在特定的 Shared 文件夹中,将 View 放在 Shared 文件夹中所有的 Controller 都可以用。

同样的,一个 Action方法也可以引用多个 View ,ASP.NET MVC 的 View 和 Controller 不是严格匹配的,一个 Action 方法可以引用多个 view,而一个 view 也可以被多个Controller使用。

创建 ViewResult 对象将会渲染成视图来给用户反馈。ViewResult 是HTML响应,而ContentResult是标准的文本响应,仅返回字符串类型。区别就在于ContentResult是ActionResult的子类。

我们一直都向往,面朝大海,春暖花开。 但是几人能做到,心中有爱,四季不败?