摘要

MVC经过其1.0和2.0版本的发展,现在已经到了3.0的领军时代,随着技术的不断改进,MVC也越来越成熟。使开发也变得简洁人性化艺术化。

园子里有很多大鸟都对MVC了如指掌,面对问题犹同孙悟空的七十二变一般游刃有余,令人羡慕。大鸟们的著作我们作为菜鸟看了又看,读了又读但是还是对MVC3.0的了解不是很深。

这种杯具的情况岂止是杯具呀,那简直就是杯具。综合分析后得出结论:眼高手低!!!

最后菜鸟痛定思过,决定从最基本的开始一步一步开始学习MVC 3.0 也希望想学习MVC3.0的小菜们分享一下下。。。。

前言

ASP.NET MVC3 在 ASP.NET MVC 1 和 2 的基础上,增加了大量的特性,使得代码更加简化,并且可以深度扩展。这篇文章提供包含在此次发布中的许多新特性的说明,分为以下部分:

  • Razor 视图引擎
  • 支持多视图引擎
  • Controller 改进
  • JavaScript 和 Ajax
  • Model 验证的改进
  • 依赖注入 Dependency Injection 的改进
  • 其他新特性

Razor 视图引擎

ASP.NET MVC3 带来了一种新的名为 Razor 的视图引擎,提供了下列优点:

  • Razor 的语法简单且清晰,只需要最小化的输入
  • Razor 容易学习,语法类似于 C# 和 VB
  • Visual Studio 对于 Razor 提供了智能提示和语法着色
  • Razor 视图不需要允许程序或者启动 Web 服务器就可以进行测试

Razor 现在提供了一些新的特征:

  • @model 用来指定传到视图的 Model 类型
  • @*  * 注释语法
  • 对于整个站点可以一次性设定默认项目,例如布局。
  • Html.Raw 方法提供了没有进行 HTML 编码的输出
  • 支持在多个视图之间共享代码 ( _viewstart.cshtml 或者 _viewstart.vbhtml )

Razor 还包含新的  HTML Helper,例如:

  • Chart. 生成图表
  • WebGrid, 生成数据表格,支持完整的分页和排序
  • Crypto,使用 Hash 算法来创建 Hash 和加盐的口令
  • WebImage, 生成图片
  • WebMail, 发送电子邮件

如下示例代码:

@model List<MvcMusicStore.Models.Album>@{    ViewBag.Title = "ASP.NET MVC Music Store";}<div id="promotion"></div>

<h3><em>Fresh</em> off the grill</h3>

<ul id="album-list">    @foreach (var album in Model)    {<li><a href="@Url.Action("Details", "Store",                new { id = album.AlbumId })">

<img alt="@album.Title" src="@album.AlbumArtUrl" /><span>@album.Title</span> </a></li>    }</ul>

关于 Razor 更多的资料,可以参考下面的资源:

  • Scott Guthrie's blog post introducing Razor
  • Scott Guthrie's blog post introducing the @model keyword
  • Scott Guthrie's blog post introducing Razor layouts
  • Razor API Quick Reference
  • MVC 3 Release Notes

支持多视图引擎

在 ASP.NET MVC3 中,增加视图的对话框中允许你选择你希望的视图引擎,在新建项目对话框中,你可以指定项目默认的视图引擎,可以选择 WebForm,Razor,或者开源的视图引擎,例如:Spark, NHaml, 或者 NDjango.

选择视图引擎:

控制器的改进

全局的 Action 过滤器

有的时候你希望能够在在一个 Action 方法执行之前或者执行之后执行一些处理逻辑,在 ASP.NET MVC2 中,提供了 Action 过滤器,允许对特定控制器的 Action 方法进行处理,实际上,有时候你希望对所有的 Action 都进行类似的处理,MVC3 允许你将过滤器加入到 GlobalFilters 集合中来创建全局的过滤器,详细的介绍,参考下列资源:

  • Scott Guthrie's blog on the MVC 3 Preview
  • Filtering in ASP.NET MVC

新的 ViewBag 属性

MVC2 中的控制器支持 ViewData 属性,允许通过后绑定的字典将数据传送给视图模板,在 MVC3 中,你可以通过 ViewBag 来更加简单的完成。例如,对于 ViewData["Message"] = "text",你可以通过 ViewBag.Message = "text" 来完成。你不需要通过类来定义任何强类型的属性,因为这是动态属性,在内部,ViewBag 属性以名-值对的形式保存在 ViewData 字典中。注意,在许多预发布版本中,这个属性被称为 ViewModel。

新的 ActionResult 类型

下面的 ActionResult 类型在 MVC3 中是新增的或者被扩展的。

  • . 向客户端返回 404 HTTP 状态. HttpNotFoundResult
  • . 基于一个布尔型的参数,返回一个临时的重定向 (HTTP 302 status code) 或者持久的重定向 (HTTP 301 status code),  结合这个改进,,  提供了三个方法来支持持久的重定向: , , 和 . 这些方法返回一个   属性为真的 对象实例。 RedirectResultControllerRedirectPermanentRedirectToRoutePermanentRedirectToActionPermanentPermanentRedirectResult
  • . 返回用户指定的 HTTP 状态码。 HttpStatusCodeResult

JavaScript 和 Ajax 改进

默认情况下,在 MVC3 中,Ajax 和验证使用不引人注目的 unobtrusive  的 JavaScript 方式。unobtrusive  不会在 HTML 中插入行内的 JavaScript ,这使得 HTML 更加精简和更少干扰,也使得更加容易被替换和定制 JavaScript 库,在 MVC3 中,验证助手默认使用 jQuery.Validate 插件完成,如果你希望使用 MVC2 的行为,你可以在 web.config 中通过配置来关闭 unobtrusive ,更多的信息参考下列资源:

  • Basic introduction to unobtrusive JavaScript on the Wikipedia site
  • Brad Wilson's Unobtrusive JavaScript Post
  • Brad Wilson's Unobtrusive JavaScript Validation Post
  • (tutorial on the ASP.NET site) Creating a MVC 3 Application with Razor and Unobtrusive JavaScript
  • MVC 3 Release Notes

默认启用了客户端验证

在早先版本的 MVC 中,你需要在视图中显式调用 Html.EnableClientValidation 方法来启用客户端验证。在 MVC3 中,已经不再需要了,因为默认就会启用客户端验证。可以在 web.config 中关闭。

为了使得客户端验证工作,你仍然需要在网站中加入对 jQuery 和 jQuery.Validation 库的引用,你可以在自己的网站中提供,或者使用 Microsoft 或者 Google 的 CDN 服务器。

远程验证

ASP.NET 3 通过一个新的标签 RemoteAttribute 对 jQuery Validation 插件的远程验证提供支持。这允许客户端的验证库自动调用一个你定义在服务器上的自定义的方法来完成只能在服务器上完成的验证逻辑。

在下面的例子中,Remote 标签指定了通过一个定义在 UsersController 中名为 UserNameAvailable 的方法来验证用户名字段。

public class User  

    [Remote("UserNameAvailable", "Users")] 
    public string UserName { get; set; } 
}

下面的代码定义在控制器中

public class UsersController  
{  
    public bool UserNameAvailable(string username)  
    {  
        if(MyRepository.UserNameExists(username))  
        {  
            return "false";  
        }  
        return "true";  
    }  
}

关于 Remote 属性的更多资源,参考  How to: Implement Remote Validation in ASP.NET MVC

JSON 绑定支持

ASP.NET MVC3 包含内置的 JSON 绑定支持,允许 Action 方法接收 JSON 编码的数据并且模型化为 Action 的参数。这个能力经常被用于客户端的模板和数据绑定中。客户端模板允许你通过客户端的模板来格式化和显示一个或者多个数据,MVC3 允许你简单的连接客户端模板和服务器端的 Action 方法,通过 JSON 来发送和接收数据,更多的信息参考:Scott Guthrie's MVC 3 Preview blog post.

Model 验证的改进

DataAnnotations 元数据标签

ASP.NET MVC3 支持 DataAnnotations 元数据标签,例如:DisplayAttribute。

ValidationAttribute 类

在 .NET Framework4 中被改进 的ValidationAttribute 类支持新的 IsValid 重载,提供关于当前验证上下文的更多信息,例如什么对象被验证了。这允许你基于 Model 的其他属性来验证当前值,例如,新的 CompareAttribute 就允许你比较 Model 的两个属性的值,在下面的例子中,ComparePassword 属性必须匹配 Password 字段来同通过验证。

public class User 
{  
    [Required] 
    public string Password { get; set; }  
    [Required, Compare("Password")]  
    public string ComparePassword { get; set; }  
}

验证接口

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:

  • 控制器 (registering and injecting controller factories, injecting controllers).
  • 视图 (registering and injecting view engines, injecting dependencies into view pages).
  • Action 过滤器 (locating and injecting filters).
  • Model 绑定器 (registering and injecting).
  • Model 验证提供器 (registering and injecting).
  • Model 元数据提供器 (registering and injecting).
  • Value 提供器 (registering and injecting).

MVC3 支持  Common Service Locator 库和任何支持这个库的 IServiceLocator 接口的 DI 容器。也支持新的容易集成到 DI 框架的 IDependencyResolver  接口。

更多关于 DI 的信息,参考:

  • Brad Wilson's series of blog posts on Service Location
  • MVC 3 Release Notes

其他新特性

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 3 release candidate  中 Partial Page Output Caching 段落,还有 MVC 3 Release Notes 中 Child Action Output Caching 段落。

在请求验证中的粒度控制

ASP.NET MVC 内建了请求验证机制来自动帮助处理类似跨站攻击和 HTML 注入等等。实际上,有时你希望能够显式关闭请求的验证,例如你希望允许用户提交 HTML 内容,例如在内容管理系统中,现在你可以通过增加 AllowHtml 标签到 Model 或者视图的 Model 来支持在绑定的时候基于一个属性关闭请求验证。更多地资料参考:

  • 中 一节. Scott Guthrie's blog post on the MVC 3 release candidateUnobtrusive JavaScript and Validation
  • MVC 3 Release Notes

可扩展的新建项目对话框

在 MVC3 中,你可以增加项目模板,视图引擎,单元测试项目框架到新建项目对话框中。

脚手架的改进

MVC3 中的脚手架对于主键提供了更好的支持,例如,脚手架的模板不会将主键加入的编辑表单中了。

默认情况下,创建和编辑的脚手架现在使用 Html.EditorFor 助手来替代 Html.TextBoxFor 助手,这个改进在增加视图对话框生成一个视图的时候,支持模型中的元数据标签。

对于 Html.LabelFor 和 Html.LabelForModel 的新重载

对于 LabelFor 和 LabelForModel 增加了新的方法重载,允许指定或者重写 Label 文本。

无 Session 的控制器支持

MVC3 中可以指定控制器是否使用 Session 状态,进而,Session 是否是读写还是只读。

新的 AdditionalMetadataAttribute 类

可以通过 AdditionalMetadataAttribute 标签对 Model 的一个属性访问 ModelMetadata.AdditionalValues 字典,例如,如果模型的某个属性仅仅支持管理员显示,你可以如下设置:

public class ProductViewModel  

    [AdditionalMetadata("AdminOnly", true)] 
    public string RefundCode {get; set;} 
}

当使用产品的 Model 来生成的时候,这个元数据将被任何显示或者编辑模板使用,这允许你来解释元数据信息。

作者:记忆逝去的青春
出处:http://www.cnblogs.com/lukun/
原文出处:http://www.asp.net/mvc/mvc3

转载于:https://www.cnblogs.com/lukun/archive/2011/07/19/2110728.html

我要学ASP.NET MVC 3.0(一): MVC 3.0 的新特性相关推荐

  1. Swift 2.0初探:值得注意的新特性

    转眼间,Swift已经一岁多了,这门新鲜.语法时尚.类型安全.执行速度更快的语言已经渐渐的深入广大开发者的心.我同样也是非常喜爱这门新的编程语言. 今年6月,一年一度的WWDC大会如期而至,在大会上A ...

  2. MySQL 8.0 在关系数据库方面有这些新特性

    作者 | 捏造的信仰 原文 | https://segmentfault.com/a/1190000013803247 本文介绍几个 8.0 在关系数据库方面的主要新特性. 你可能已经知道 MySQL ...

  3. accept 返回0_从0开始理解Vite的主要新特性(一)

    此文已同步到公众号[因卓诶]以及因卓诶博客: 从0开始理解Vite的主要新特性(一) - 因卓诶-爱分享爱原创的技术博客 ~ 个人博客​www.yinzhuoei.com vite这个工具确实尤大在微 ...

  4. Kafka 2.8.0 正式发布,增加了哪些新特性?

    导读:目前 Kafka 已经定位为一个分布式流式处理平台,它以高吞吐.可持久化.可水平扩展.支持流数据处理等多种特性而被广泛使用.目前越来越多的开源分布式处理系统如 Cloudera.Storm.Sp ...

  5. C#8.0的两个有趣的新特性以及gRPC

    最近每天忙着跑很多地方,回家就不想动了,没什么心情写东西.今天有空,稍微写一点. 下文中: 关于C#语法特性的部分需要Visual Studio 2019支持. 关于.NET Core的部分需要安装. ...

  6. c# 路径下的最近文件夹_C#8.0的两个有趣的新特性以及gRPC

    最近每天忙着跑很多地方,回家就不想动了,没什么心情写东西.今天有空,稍微写一点. 下文中: 关于C#语法特性的部分需要Visual Studio 2019支持. 关于.NET Core的部分需要安装. ...

  7. CentOS 7.6 MySQL 8.0 RPM包方式安装及新特性介绍

    一.MySQL 8.0新特性: 1.默认字符集由latin1变为utf8mb4 2.MyISAM系统表全部换成InnoDB表 3.自增主键AUTO_INCREMENT的值支持持久化 4.InnoDB表 ...

  8. 重磅!阿里云MongoDB 5.0发布,速来围观新特性

    简介:2021年9月29日下午,阿里云数据库与MongoDB共同发布了阿里云MongoDB 5.0.MongoDB于2021年7月中发布最新5.0版本,阿里云MongoDB率先跟进官方最新版本能力,快 ...

  9. php7.0 yield,PHP7中生成器的新特性 yield-from amp;amp; return-values

    生成器委托 简单地翻译官方文档的描述: PHP7中,通过生成器委托(yield from),可以将其他生成器.可迭代的对象.数组委托给外层生成器.外层的生成器会先顺序 yield 委托出来的值,然后继 ...

  10. mysql rpm 安装6_CentOS 7.6 MySQL 8.0 RPM包方式安装及新特性介绍

    一.MySQL 8.0新特性: 1.默认字符集由latin1变为utf8mb4 2.MyISAM系统表全部换成InnoDB表 3.自增主键AUTO_INCREMENT的值支持持久化 4.InnoDB表 ...

最新文章

  1. 深入探讨:视觉的目的是什么?
  2. This Handler class should be static or leaks might occur(null) 解决办法 (转)
  3. Count and Say leetcode java
  4. CentOS下搭建Squid代理服务器
  5. unity2019,打包APK时的gradle错误问题
  6. iOS根据图片url获取尺寸
  7. Flurl使用Polly实现重试Policy
  8. G1垃圾收集器深度剖析
  9. Linux上简体繁体文件的相互转换
  10. 文件上传表单 上传文件的细节 文件上传下载和数据库结合
  11. xmu1214: 购物
  12. spring事务源码分析结合mybatis源码(二)
  13. java将一个字符串数组复制到一个字符串_C语言 | 将元音字母复制到另一个字符串中...
  14. 障碍期权定价 python_python障碍式期权定价公式
  15. Clickhouse:日志表占用大量磁盘空间怎么办?
  16. Eclipse中Java项目转化为Java Web项目
  17. PTA作业记录1(计算存款利息)
  18. 【云原生之Docker实战】使用Docker部署MrDoc个人在线文档系统
  19. 汇编中浮点栈寄存器st0~st7浮点计算fld压栈再计算的过程运行原理
  20. cron表达式解析 + robfig/cron 源码剖析

热门文章

  1. jar包升级部署到服务器详细流程,将服务部署在linux中
  2. 伍六七带你学算法——栈的使用
  3. 2022-2028年中国醋酸行业投资分析及前景预测报告
  4. Docker入门六部曲——Swarm
  5. 使用 alpine 打包镜像注意事项
  6. PyCharm_10个加速省时间技巧
  7. np.percentile()函数超详解 异常值极端值百分位四分位数
  8. 理解和实现分布式TensorFlow集群完整教程
  9. PyTorch: 序列到序列模型(Seq2Seq)实现机器翻译实战
  10. Django 定义模型2.1