摘要:
- 理解ASP.NET MVC
- ASP.NET MVC3概述
- MVC应用程序的创建方法
- MVC应用程序的结构
1.ASP.NET支持的两层抽象
- System.Web.UI:Web Forms层,由服务器控件、ViewState等组成
- System.Web:管道程序,提供基本的Web堆栈,其中包括组件模块,处理程序和HTTP堆栈等。
WebForm拖放控件方式缺点:混淆页面生命周期,生成不太理想的HTML页面
2.MVC的发展
MVC成为计算机科学领域重要的构建模式已有多年历史。
1979年,最初被命名为:事物-模型-视图-编辑器(Thing-Model-View-Editor),后来简化为模型-视图-控制器(Model-View-Controller)
在分离应用程序内部的关注点方面,MVC是一种强大而简洁的方法,尤其是应用在Web应用程序中。
MVC将应用程序的用户界面分为三个主要部分:
- 模型:组类,描述了要处理的数据以及修改和操作数据的业务逻辑。
- 视图:定义应用程序用户界面的显示方式。
- 控制器:一组类,用于处理来自用户、整个应用程序流以及特定应用程序逻辑的通信。
3.MVC在Web框架中的应用
在ASP.NET MVC中,MVC的三个主要部分的定义大致如下:
模型:模型是描述程序设计人员感兴趣问题域的一些类,这些类通常封装存储在数据库中的数据,以及操作这些数据和执行特定域业务逻辑的代码。在ASP.NET MVC中,模型就像是一个使用了某个工具的数据访问层,这个工具包括实体框架EF或者包含特定域逻辑的自定义代码组合在一起的NHibernate。
视图:一个动态生成HTML页面的末班。
控制器:一个协调视图和模型之间关系的特殊类。它响应用户的输入,与模型进行对话,并决定呈现哪个视图。后缀名为Controller。
4.ASP.NET MVC的优势
ASP.NET MVC的上下文是问题域(一个无状态的Web环境)和宿主系统(ASP.NET)
ASP.NET MVC依赖于许多与其它MVC平台所使用的相同的核心策略,再加上它提供的编译和托管代码的好处,以及利用.NET语言的新特性,比如Lambda表达式、动态和匿名类型,使其成为强大的开发框架。不过,本质上,ASP.NET采用了大部分基于MVC的Web框架所使用的一些基本原则:
- 约定优于配置(convention over configuration)
- 不重复(又名DRY原则)
- 尽量保持可插拔性(pluggability)
- 尽量为开发人员提供帮助,但必要时运行开发人员*发挥
5.MVC3的发展历程
2007年2月,Scott Guthrie在飞机上草拟了ASP.NET MVC的核心思想。
ASP.NET MVC1 于2009年3月13日正式发布。
ASP.NET MVC2 于2010年3月发布。发布的一个重要先例是无重大改动,验证了ASP.NET MVC结构化设计,可在核心不变情况下进行大量扩展。
部分主要特点:
- 带有自定义模板的UI程序。
- 在客户端和服务端基于特性的模型验证。
- 强类型HTML辅助程序。
- 改善的Visual Studio开发工具。
增强的API功能:
- 支持将大型应用程序划分为区域。
- 支持异步控制器。
- 使用Html.RenderAction支持渲染网页或网站的某一部分。
- 许多新的辅助函数,实用工具和API增强。
ASP.NET MVC3于ASP.NET MVC2发布后的第10个月推出。主要改进:
- 友好的视图表达,其中包括性的Razor视图引擎。
- 支持.NET4数据注解。
- 改进了模型验证,验证简洁高效。
- 与依赖项解析(Dependency Resolution)和全局操作过滤器(Global Action Filters)的强关联。
- 丰富的JavaScript支持,其中包括非侵入式JavaScript、JQuery验证和JSON绑定。
- 支持使用Nuget。
6.Razor视图引擎
在10年前ASP.NET1.0发布以来,Razor是在渲染HTML方面的第一个重要更新。目标是支持图形编辑器中的编辑控件。
在ASP.NET MVC1 和ASP.NET MVC2中默认使用的视图引擎普遍被称为Web Forms视图引擎(Web Forms View Engine),因为和Web Forms使用了同样ASPX/ASCX/MASTER文件和语法。
Razor语法易于输入、易于阅读。不像WebForm视图引擎那样具有类似于XML的繁杂的语法规则。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
<%@ Page Language= "C#"
MasterPageFile= "</Views/Shared/Site.Master"
Inherits= "System.Web.Mvc.ViewPage<MvcMusicStore.ViewModels.StoreBrowseViewModel>"
%> //Razor @model MvcMusicStore.Models.Genre <asp:Content ID= "Content1"
ContentPlaceHolderID= "TitleContent"
runat= "server" >
Browse Albums
</asp:Content> //Razor @{ViewBag.Title = "Browse Albums" ;}
<asp:Content ID= "Content2"
ContenPlaceHolderID= "MainContent"
runat= "server" >
<div class = "genre" >
<h3><em><%:Model.Genre.Name %></em>Albums</h3>
<ul id= "album-list" >
<% foreach ( var
album in
Model.Albums) {%>
<li>
<a href= "<%:Url.Action(" Details ",new{id = album.AlbumId }) %>" >
<img alt= "<%:album.Title%>"
src= "<%:album.AlbumArtUrl %>" />
<span><%:album.Title%></span>
</a>
</li>
<% } %>
</ul>
</div>
</asp:Content> //Razor <div class = "genre" >
<h3><em>@Model.Name</em>Albums</h3>
<ul id= "album-list" >
@ foreach ( var
album in
Model.Albums)
{
<li>
<a href= "@Url.Action(" Details ",new{id = album.AlbumId }) " >
<img alt= "@album.Title"
src= "@album.AlbumArtUrl" />
<span>@album.Title</span>
</a>
</li>
}
</ul>
</div> |
Razor语法的设计目标:
- 简洁,富有表现力和灵活性
- 不是新语言
- 容易学习
- 支持所有文本编辑器
- 强大的智能感知功能
- 单元测试
7.验证的改善(不太理解)
- 支持.NET4的数据注解
- 包含改进模型验证的简化验证:ASP.NET MVC3支持IValidatableObject接口,可以在模型类中实现接口以及相应的验证方法(Validate)
8.强大的JS支持
非侵入式JS
非侵入式JS是一个一般术语,它表达了一个哲理,类似于术语表述性状态转移。非侵入式JS的高层次描述就是不影响网页标记。
ASP.NET MVC3采用两种方式支持非侵入式JS,分别是:
- Ajax辅助类(比如Ajax.ActionLink和Ajax.BeginForm)结合利用扩展的特性(data-特性)和JQuery技术为FORM标签提供简洁的标记
- Ajax验证不再将验证规则以一块发出,而是应用data-特性发出。
JQery验证
ASP.NET MVC2用JQery进行传送,而用Ajax进行验证。MVC3通过将验证支持转换到流行的JQery验证插件上运行,完成了使用JQuery的Ajax支持的过渡。
JSON绑定
ASP.NET MVC3通过新的JsonValueProviderFactory支持JSON(JS Object Notation)绑定,这样可以使操作方法接受和模型绑定(model-bind)JSON格式的数据。
9.高级功能
ASP.NET MVC3通过依赖项解析和全局操作过滤器在简化比较复杂的应用程序级任务方面也取得了一些大的进展。
依赖项解析(dependency resolver)
简化了在应用程序中依赖注入的使用,使得分离应用程序组件更加容易,从而使组件更容易配置和测试。如:
- 控制器(注册和注入控制器工厂,注入控制器)
- 视图(注册和注入视图引擎,向视图页面注入依赖关系)
- 操作过滤器(定位和注入过滤器)
- 模型绑定器(注册和注入)
- 模型验证提供器(注册和注入)
- 模型元数据提供器(注册和注入)
- 值提供器(注册和注入)
全局操作过滤器
ASP.NET MVC2的操作过滤器可以提供一段执行代码的钩子,使得代码可以在一个方法执行之前或之后执行。这个功能通过自定义特性实现,自定义特性可以应用于控制器操作或者整个控制器。
ASP.NET MVC3扩展了这一功能,对于处理应用程序基础结构问题,像错误处理和日志记录尤其有用。
10.使用MVC3的必需组件
- Microsoft.Web.Infrastructure
- System.Web.Helpers
- System.Web.Mvc
- System.Web.Razor
- System.Web.WebPages
- System.Web.WebPages.Deployment
- System.Web.WebPages.Razor
11.应用程序模板
Internet Application和Intranet Application区别:后者是作为MVC3工具更新的一部分添加的,账户管理功能不是针对ASP.NET Membership系统而是针对Windows账户
12.ASP.NET MVC应用程序结构
项目默认含有6个*目录
/Controllers:用于保存那些处理URL请求的Controller类
/Models:用于保存那些表示和操纵数据以及业务对象的类
/Views:用于保存那些辅助呈现输出结果的UI模板文件
/Scripts:用于保存JS库文件和脚本
/Content:用于保存CSS和图像文件以及其他费动态/非JS的内容
/App_Data:用于存储想要读取/写入的数据文件
13.ASP.NET MVC和约定
设计ASP.NET MVC是围绕一些明智的基于约定的默认项,这些默认项在需要的时候可以被覆盖,这个概念通常作为“约定优于配置”被引用
约定优于配置:没有必要再配置文件中设置文件夹名称—它们约定在配置文件中。这样避免了编辑XML的工作。
下面是预期的程序结构:
- 每一个Controller类的名字以Controller结束
- 应用程序的所有视图放在一个单独的Views目录下
- 控制器使用的视图是在Views主目录的一个子目录中,这个子目录是根据控制器名称来命名的。
约定简化通信:约定可以帮助您清晰地与其他开发人员进行交流。不用详细地描述如何构建应用程序的每一方面。