当前位置: 首页 > 编程日记 > 正文

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

摘要

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 { getset; } 
}

 

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

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 { getset; }  
    [Required, Compare(
"Password")]  
    
public string ComparePassword { getset; }  
}

 

验证接口

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 {getset;} 
}

 

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


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

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

相关文章:

【java】兴唐第12-14节笔记整理

第十四节课 1、eclipse快捷键 alt shift s给所有属性写get set函数 2、给文件重命名&#xff1a; ctrl F2 3、上转型对象调用方法调用的是子类重写的方法 4、在任何情况下&#xff0c;子类对象都可以访问父类受保护方法&#xff08;protected&#xff09; 注意&#xff1a; …

[ZZ]Map/Reduce hadoop 细节

转自&#xff1a;Venus神庙原文&#xff1a;http://www.cnblogs.com/duguguiyu/archive/2009/02/28/1400278.html 分布式计算&#xff08;Map/Reduce&#xff09; 分布式计算&#xff0c;同样是一个宽泛的概念&#xff0c;在这里&#xff0c;它狭义的指代&#xff0c;按Google …

类加载器双亲委派模式

双亲委派模型的工作流程是&#xff1a;如果一个类加载器收到了类加载的请求&#xff0c;它首先不会自己去尝试加载这个类&#xff0c;而是把请求委托给父加载器去完成&#xff0c;依次向上&#xff0c;因此&#xff0c;所有的类加载请求最终都应该被传递到顶层的启动类加载器中…

Kubernetes 架构(下)【转】

上一节我们讨论了 Kubernetes 架构 Master 上运行的服务&#xff0c;本节讨论 Node 节点。 Node 是 Pod 运行的地方&#xff0c;Kubernetes 支持 Docker、rkt 等容器 Runtime。 Node上运行的 Kubernetes 组件有 kubelet、kube-proxy 和 Pod 网络&#xff08;例如 flannel&#…

【工具软件】Xmind的使用

1、打开历史保存的记录的方法 窗口 - 文本编辑历史 - 恢复 2、批量修改 编辑 - 查找/替换 3、如果子主体很多,而且有文本格式的&#xff0c;可以直接选中父父主题复制粘贴 4、窗口 - 黑匣子 自己做的脑图系统会自动备份。 5、常用快捷键 &#xff08;1&#xff09;创建子主…

小脚本,统计一个目录下满足特定条件文件的代码行数

find -regex .*cc -o -regex .*h | xargs wc -lfind也自带了执行命令的方法&#xff1a;find -regex .*cc -o -regex .*h -exec wc -l {} \; 这种方法的结果不太对&#xff0c;只能统计到满足 -regex .*h 的文件注明一下&#xff1a; find默认从当前目录递归的查找&#xff1b…

CCNA CCNP CCIE所有实验名称完整版

只能仅供参考了&#xff01;具体的实验内容就没了&#xff0c;失望了&#xff01;实验1&#xff1a;通过Console端口访问Cisco路由器  实验2&#xff1a;通过Telnet访问Cisco路由器  实验3&#xff1a;配置终端服务器  实验4&#xff1a;通过浏览器访问路由器  实验5&#…

Real World Haskell 第七章 I/O

几乎所有程序都是用来从外部世界收集数据&#xff0c;处理数据&#xff0c;并把处理结果返回给外部世界的。也就是说&#xff0c;输入和输出对于程序设计来说相当关键。Haskell的I/O系统很强大&#xff0c;表达能力很强也很容易使用&#xff0c;理解它的原理对于学习Haskell来说…

malloc函数分配失败处理的严重性

本次在实际测试情况下&#xff0c;发现程序无缘无故的异常&#xff0c;导致看门狗超时复位&#xff0c;经过排查是malloc函数分配失败的时候&#xff0c;依然对指针进行了操作&#xff0c;导致异常。以前没重视这个问题是因为&#xff0c;总觉的malloc基本都会成功的&#xff0…

kvm--virsh命令行下管理虚拟机

virsh 既有命令行模式&#xff0c;也有交互模式&#xff0c;在命令行直接输入 virsh 就进入交互模式&#xff0c; virsh 后面跟命令参数&#xff0c;则是命令行模式&#xff1b; &#xff08;1&#xff09;基础操作 --- 命令行下管理虚拟机 virsh list 列出当前宿…

【java】兴唐第十八节课

1、java接口的关键字&#xff1a;implements,可实现多个接口&#xff0c;接口接口之间使用逗号分隔。 注&#xff1a; 继承只能继承一个&#xff0c;接口可以实现多个 2、在接口里所有的方法都是抽象方法&#xff0c;不用关键字abstract修饰。 3、接口不能定义变量&#xff0…

转换前台javascript传递过来的时间字符串到.net的DateTime

javascript: var datenew Date().toString();得到的结果类似于:Wed Oct 27 2010 08:53:04 GMT0800 如何在C#中把这个字符串转换为DateTime类型呢&#xff1f;DateTime.ParseExact("Wed Oct 27 16:23:44 UTC0800 2010","ddd MMM dd HH:mm:ss UTCzzzzz yyyy"…

树状数组 | 1057

用哈希&#xff0c;把push的数x作为下标给hashTable&#xff08;实则不存在&#xff0c;直接用tree树状数组记录数据&#xff09;1&#xff0c;pop则是以最后一个数x作为下标-1 。 树状数组和其原理不再赘述&#xff0c;需要注意的是最后的二分搜索&#xff08;实则是lower_bou…

7、vue中将token存到cookie

使用js-cookie工具&#xff1a; 1.npm i js-cookie //安装2.import Cookies from js-cookie //引用 // 存入cookie&#xff1a;Cookies.set(token,value) // 获取cookie&#xff1a;Cookies.set(token) //删除cookie:Cookies.remove(token)转载于:https://www.cnblogs.com/xlfd…

MySQL数据库表名、列名、别名区分大小写的问题

MySQL在Linux下数据库名、表名、列名、别名大小写规则是这样的&#xff1a; 1、数据库名与表名是严格区分大小写的&#xff1b; 2、表的别名是严格区分大小写的&#xff1b; 3、列名与列的别名在所有的情况下均是忽略大小写的&#xff1b; 4、变量名也是严格区分大小写的&#…

【java】兴唐第十七节课

1、抽象类&#xff1a; 概念:由abstract修饰的类叫抽象类。 特征&#xff1a;在抽象类中有抽象方法 注意&#xff1a; &#xff08;1&#xff09;抽象方法必须定义到抽象类中&#xff0c;即有抽象方法的类一定是抽象类。抽象类的非抽象子类必须实现父类的抽象方法&#xff0c…

条款22: 尽量用“传引用”而不用“传值”

c语言中&#xff0c;什么都是通过传值来实现的&#xff0c;c继承了这一传统并将它作为默认方式。除非明确指定&#xff0c;函数的形参总是通过“实参的拷贝”来初始化的&#xff0c;函数的调用者得到的也是函数返回值的拷贝。正如我在本书的导言中所指出的&#xff0c;“通过值…

C++ RCSP智能指针简单实现与应用

智能指针的实现代码来源博客&#xff1a;《http://blog.csdn.net/to_be_better/article/details/53570910》 修改&#xff1a;添加 get()函数&#xff0c;用以获得原始指针&#xff08;raw pointer&#xff09;。 其余思路来源《Effective C》 智能指针的实现代码如下&#xff…

末学者笔记--openstack共享组件:rabbitmq(3)

openstack共享组件&#xff1a;消息队列rabbitmq 一、MQ 全称为 Message Queue, 消息队列&#xff08; MQ &#xff09; 是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息&#xff08;针对应用程序的数据&#xff09;来通信&#xf…

【matlab】2019.5.10第一节上机课练习

1、计算角度和弧度的方法 例 a 17&#xff0c;b 24&#xff0c;c 26 求一个角分别以角度和弧度的方式给出 解&#xff1a; %//用余弦定理求出余弦值 pos (a b c)/(2*a*b) %//用acos求出弧度值 angle acos(pos)%//求出角度值realangle angle*180/pi2、创建矩阵的方法 A…

【学习笔记】Silverlight框架:Jounce(4)——事件通信

Prism、CM和Jounce里都有各自的事件通信机制&#xff0c;也都叫EventAggregator。 相比于Prism&#xff0c;Jounce里的EventAggregator的风格更接近CM。当然作者也是这么说的&#xff1a;The pattern here is based on the lightweight version Rob Eisenburg introduced with …

10个最常用 Windows Vista运行命令

Windows Vista以其华丽的界面和全新的操作方式受到大众喜爱&#xff0c;但实际上&#xff0c;如果你善于使用“运行”命令&#xff0c;仍然可以大大简化操作&#xff0c;甚至是发现一些常规菜单里没有的功能的。 下面就给大家讲讲Windows Vista下面的一些工具命令&#xff0c;你…

非常好的博客网站

下面的内容是转载的&#xff0c; 原文&#xff1a; https://klionsec.github.io/archives/ http://www.leifc.com/ ------------------------------------------------------------------------------ 个人始终坚信,所有不以实际入侵和防御为目的的安全研究都是耍流氓 [ 目…

反向代理Nginx

引用&#xff1a;https://baijiahao.baidu.com/s?id1600687025749463237&wfrspider&forpc 参考下图&#xff0c;正向代理用途&#xff1a;Client无法直接访问Server&#xff0c;比如谷歌FQ&#xff0c;于是请求发送给代理&#xff0c;代理可以访问Server并将其返回信息…

asp.net mvc3 Razor引擎中@使用规则小记

项目中前台用的是asp.net mvc3&#xff0c;Razor引擎&#xff08;关于Razor的介绍可以参考&#xff1a;http://weblogs.asp.net/scottgu/archive/2010/07/02/introducing-razor.aspx&#xff09;&#xff0c;深深体验到了Razor引擎的方便强大。但在编码过程中也遇到了一些问题&…

【matlab】第二章基本使用方法

&#xff08;一&#xff09;操作练习 1、整型数据类型的定义 代码实现 x int8(50)2、创建一个复数 代码实现&#xff1a; //情况1 complex(2); //输出结果&#xff1a; ans 1.0000 0.0000i//情况2 complex(1,2);//输出结果&#xff1a; ans 1.0000 2.0000i//情况3a compl…

一位美国前辈工程师的十大职业发展忠告

1、好好规划自己的路&#xff0c;不要跟着感觉走&#xff01;根据个人的理想决策安排&#xff0c;绝大部分人并不指望成为什么院士或教授&#xff0c;而是希望活得滋润一些&#xff0c;爽一些。那么&#xff0c;就需要慎重安排自己的轨迹。从哪个行业入手&#xff0c;逐渐对该行…

Vagrant安装指南

ubuntu的易用性很高&#xff0c;安装很简单&#xff0c;颜值也高&#xff0c;但是我工作中经常使用centos&#xff0c;我希望我的笔记本也是centos&#xff0c;但是&#xff0c;centos颜值太低&#xff0c;配置文件很复杂&#xff0c;不想弄这个太麻烦&#xff0c;于是&#xf…

树状数组的理解(前缀和 and 差分)

二更—— 有神仙反映数星星那个题外链炸了&#xff0c;我决定把图给你们粘一下&#xff0c;汉语翻译的话在一本通提高篇的树状数组那一章里有&#xff0c;同时也修改了一些汉语语法的错误 这段时间学了线段树组&#xff0c;当神仙们都在学kmp和hash的时候&#xff0c;我这个蒟蒻…

【java】兴唐第十九节课(内部类)

内部类&#xff1a;在类的内部定义的类叫内部类 1、有名内部类&#xff1a; &#xff08;1&#xff09;实例化时必须先实例化外部对象&#xff0c;格式&#xff1a; 外部类.内部类 对象名 外部类对象名.new.内部类名&#xff08;&#xff09;&#xff1b; 代码实现&#xff1…