mvc1 模式:
view接收用户输入,把命令传到controller
controller处理命令,更新model
model被更新后,会通知view需要update
view更新后向用户显示
mvc2 模式:
由于mvc1中,model可以通知view,然后view就可以被更新,这在windows程序中很常见,像MFC的frame-document-view架构,如果document改变了,他会主动通知view进行update
但是在web中,作为model的java bean更新后,无法调用作为view的jsp(而且view通常很多,需要选一个),因此改为mvc2模式:
view接收用户输入,把命令传到controller
controller处理命令,更新model
model被更新后,controller会选一个view并forward到这个jsp,附带把model放到request参数
这个view获得model然后显示
ASP.NET MVC 3 新特性全解析
ASP.NET MVC3 在 ASP.NET MVC 1和 2的基础上,增加了大量的特性,使得代码更加简化,并且可以深度扩展。这篇文章提供包含在此次发布中的许多新特性的说明.
Razor 视图引擎
ASP.NET MVC3 带来了一种新的名为 Razor的视图引擎,提供了下列优点:
Razor 现在提供了一些新的特征:
Razor 还包含新的 HTML Helper,例如:
支持多视图引擎
在ASP.NET MVC3中,增加视图的对话框中允许你选择你希望的视图引擎,在新建项目对话框中,你可以指定项目默认的视图引擎,可以选择 WebForm,Razor,或者开源的视图引擎,例如:Spark, NHaml, 或者 NDjango.
控制器的改进
全局的Action 过滤器
有的时候你希望能够在在一个 Action方法执行之前或者执行之后执行一些处理逻辑,在 ASP.NET MVC2中,提供了 Action过滤器,允许对特定控制器的 Action方法进行处理,实际上,有时候你希望对所有的 Action都进行类似的处理,MVC3允许你将过滤器加入到 GlobalFilters集合中来创建全局的过滤器.
新的 ViewBag属性
MVC2 中的控制器支持 ViewData属性,允许通过后绑定的字典将数据传送给视图模板,在 MVC3中,你可以通过 ViewBag来更加简单的完成。例如,对于 ViewData["Message"] ="text",你可以通过 ViewBag.Message = "text"来完成。你不需要通过类来定义任何强类型的属性,因为这是动态属性,在内部,ViewBag属性以名-值对的形式保存在 ViewData字典中。注意,在许多预发布版本中,这个属性被称为 ViewModel。
新的 ActionResult类型
下面的ActionResult类型在 MVC3中是新增的或者被扩展的。
JavaScript 和 Ajax改进
默认情况下,在 MVC3中,Ajax和验证使用不引人注目的 unobtrusive的 JavaScript方式。unobtrusive不会在 HTML 中插入行内的 JavaScript,这使得 HTML 更加精简和更少干扰,也使得更加容易被替换和定制 JavaScript库,在 MVC3中,验证助手默认使用 jQuery.Validate插件完成,如果你希望使用 MVC2的行为,你可以在 web.config中通过配置来关闭 unobtrusive .
默认启用了客户端验证
在早先版本的 MVC 中,你需要在视图中显式调用 Html.EnableClientValidation方法来启用客户端验证。在 MVC3中,已经不再需要了,因为默认就会启用客户端验证。可以在 web.config中关闭。
为了使得客户端验证工作,你仍然需要在网站中加入对 jQuery和 jQuery.Validation库的引用,你可以在自己的网站中提供,或者使用 Microsoft或者 Google的 CDN 服务器。
远程验证
ASP.NET 3 通过一个新的标签 RemoteAttribute对 jQuery Validation插件的远程验证提供支持。这允许客户端的验证库自动调用一个你定义在服务器上的自定义的方法来完成只能在服务器上完成的验证逻辑。
在下面的例子中,Remote 标签指定了通过一个定义在 UsersController中名为 UserNameAvailable的方法来验证用户名字段。
·
o Razor 的语法简单且清晰,只需要最小化的输入
o Razor 容易学习,语法类似于 C# 和 VB
o Visual Studio对于 Razor提供了智能提示和语法着色
o Razor 视图不需要允许程序或者启动 Web 服务器就可以进行测试
o @model 用来指定传到视图的 Model 类型
o @* * 注释语法
o 对于整个站点可以一次性设定默认项目,例如布局。
o Html.Raw 方法提供了没有进行 HTML 编码的输出
o 支持在多个视图之间共享代码 ( _viewstart.cshtml或者 _viewstart.vbhtml )
o Chart. 生成图表
o WebGrid, 生成数据表格,支持完整的分页和排序
o Crypto,使用 Hash算法来创建 Hash和加盐的口令
o WebImage, 生成图片
o WebMail, 发送电子邮件
o HttpNotFoundResult.向客户端返回 404 HTTP状态.
o RedirectResult.基于一个布尔型的参数,返回一个临时的重定向 (HTTP 302 status code)或者持久的重定向 (HTTP 301 status code),结合这个改进,, Controller提供了三个方法来支持持久的重定向: RedirectPermanent, RedirectToRoutePermanent,和RedirectToActionPermanent.这些方法返回一个 Permanent属性为真的 RedirectResult对象实例。
o HttpStatusCodeResult.返回用户指定的 HTTP状态码。
1. public class User
2. {
3. [Remote("UserNameAvailable", "Users")]
4. public string UserName { get; set; }
5. }
下面的代码定义在控制器中
1. public class UsersController
2. {
3. public bool UserNameAvailable(string username)
4. {
5. if(MyRepository.UserNameExists(username))
6. {
7. return "false";
8. }
9. return "true";
10. }
11. }
关于 Remote 属性的更多资源,参考 How to: Implement Remote Validation inASP.NET MVC http://msdn.microsoft.com/en-us/library/gg508808(VS.98).aspx
JSON 绑定支持
ASP.NET MVC3 包含内置的 JSON绑定支持,允许 Action方法接收 JSON编码的数据并且模型化为 Action的参数。这个能力经常被用于客户端的模板和数据绑定中。客户端模板允许你通过客户端的模板来格式化和显示一个或者多个数据,MVC3允许你简单的连接客户端模板和服务器端的 Action方法,通过 JSON来发送和接收数据,更多的信息参考:Scott Guthrie's MVC 3 Preview blog post.
ValidationAttribute 类
在.NET Framework4中被改进的ValidationAttribute类支持新的 IsValid重载,提供关于当前验证上下文的更多信息,例如什么对象被验证了。这允许你基于 Model的其他属性来验证当前值,例如,新的 CompareAttribute就允许你比较 Model的两个属性的值,在下面的例子中,ComparePassword属性必须匹配 Password字段来同通过验证。
Model 验证的改进
DataAnnotations 元数据标签
ASP.NET MVC3 支持DataAnnotations元数据标签,例如:DisplayAttribute。
1. public class User
2. {
3. [Required]
4. public string Password { get; set; }
5. [Required, Compare("Password")]
6. public string ComparePassword { get; set; }
7. }
验证接口
IValidatableObject 接口允许执行 Model水平的验证,并且允许你提供整个模型状态的验证错误信息,或者基于 Model的两个属性。当 Model绑定的时候,MVC3从 IValidatableObject接收错误信息,在视图中使用内建的 HTML助手时,将会自动标识或者高亮受影响的字段。
IClientValidatable 接口允许 ASP.NET MVC在运行时发现支持的客户端验证器,这个接口被用来支持集成不同的验证框架。
更加关于验证接口的内容,参考 Scott Guthrie's MVC 3 Preview blog post中 Model Validation Improvements一节。
依赖注入Dependency Injection的改进
ASP.NET MVC3 提供了更好的 DI和 IoC支持,在下面的地方支持 DI:
MVC3 支持 Common Service Locator库和任何支持这个库的 IServiceLocator接口的 DI 容器。也支持新的容易集成到 DI框架的 IDependencyResolver接口。
更多关于 DI 的信息,参考:
其他新特性
NuGet 集成
ASP.NET MVC3 自动安装和启用 NuGet,NUGet是免费开源的一个包管理器,使得在你的项目中容易发现,安装,和使用 .NET库。它可以和所有的 Visual Studio项目类型一起工作,包括 ASP.NET WebForm和 MVC。
NuGet 允许开发者维护开源项目,例如,像 Moq项目,NHibernate等等,可以注册它们到一个在线的网站中。
更多信息参考:NuGet documentation on the CodePlex site.
部分页的输出缓存
ASP.NET MVC 从版本1开始支持整页缓存,MVC3还提供了部分页缓存。这可以允许你容易地缓存输出的一个区域或者片断,更多地内容参考 Scott Guthrie's blog post on the MVC 3release candidate中 Partial Page Output Caching段落,还有 MVC 3 Release Notes中 Child Action Output Caching段落。
在请求验证中的粒度控制
ASP.NET MVC 内建了请求验证机制来自动帮助处理类似跨站攻击和 HTML注入等等。实际上,有时你希望能够显式关闭请求的验证,例如你希望允许用户提交 HTML内容,例如在内容管理系统中,现在你可以通过增加 AllowHtml标签到 Model或者视图的 Model来支持在绑定的时候基于一个属性关闭请求验证。更多地资料参考:
可扩展的新建项目对话框
在 MVC3 中,你可以增加项目模板,视图引擎,单元测试项目框架到新建项目对话框中。
脚手架的改进
MVC3 中的脚手架对于主键提供了更好的支持,例如,脚手架的模板不会将主键加入的编辑表单中了。
默认情况下,创建和编辑的脚手架现在使用 Html.EditorFor助手来替代 Html.TextBoxFor助手,这个改进在增加视图对话框生成一个视图的时候,支持模型中的元数据标签。
对于 Html.LabelFor和 Html.LabelForModelPDF的新重载
对于LabelFor 和LabelForModel 增加了新的方法重载,允许指定或者重写 Label文本。
无 Session的控制器支持
MVC3 中可以指定控制器是否使用 Session状态,进而,Session是否是读写还是只读。
新的AdditionalMetadataAttributePDF类
可以通过AdditionalMetadataAttribute标签对 Model的一个属性访问 ModelMetadata.AdditionalValues字典,例如,如果模型的某个属性仅仅支持管理员显示,你可以如下设置:
·
o 控制器 (registering and injecting controllerfactories, injecting controllers).
o 视图 (registering and injecting view engines,injecting dependencies into view pages).
o Action 过滤器 (locating and injecting filters).
o Model 绑定器 (registering and injecting).
o Model 验证提供器 (registering and injecting).
o Model 元数据提供器 (registering and injecting).
o Value 提供器买卖IC网 (registering and injecting).
o Brad Wilson's series of blog posts on ServiceLocation
o MVC 3 Release Notes
o Scott Guthrie's blog post on the MVC 3 releasecandidate中Unobtrusive JavaScript and Validation一节.
o MVC 3 Release Notes
来自:http://www.cnblogs.com/liwei823/archive/2011/10/14/2212569.html