2011年10月14日

ASP.NET MVC区别

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 的方法来验证用户名字段。

    • Razor 的语法简单且清晰,只需要最小化的输入
    • Razor 容易学习,语法类似于 C# 和 VB
    • Visual Studio 对于 Razor 提供了智能提示和语法着色
    • Razor 视图不需要允许程序或者启动 Web 服务器就可以进行测试
    • @model 用来指定传到视图的 Model 类型
    • @* * 注释语法
    • 对于整个站点可以一次性设定默认项目,例如布局。
    • Html.Raw 方法提供了没有进行 HTML 编码的输出
    • 支持在多个视图之间共享代码 ( _viewstart.cshtml 或者 _viewstart.vbhtml )
    • Chart. 生成图表
    • WebGrid, 生成数据表格,支持完整的分页和排序
    • Crypto,使用 Hash 算法来创建 Hash 和加盐的口令
    • WebImage, 生成图片
    • WebMail, 发送电子邮件
    • HttpNotFoundResult. 向客户端返回 404 HTTP 状态.
    • RedirectResult. 基于一个布尔型的参数,返回一个临时的重定向 (HTTP 302 status code) 或者持久的重定向 (HTTP 301 status code), 结合这个改进,, Controller 提供了三个方法来支持持久的重定向: RedirectPermanent, RedirectToRoutePermanent, 和 RedirectToActionPermanent. 这些方法返回一个 Permanent 属性为真的 RedirectResult 对象实例。
    • 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 in ASP.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 3 release 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.LabelForModel PDF的新重载
对于 LabelFor 和 LabelForModel 增加了新的方法重载,允许指定或者重写 Label 文本。

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

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

    • 控制器 (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 提供器买卖IC网 (registering and injecting).
    • Brad Wilson's series of blog posts on Service Location
    • MVC 3 Release Notes
    • Scott Guthrie's blog post on the MVC 3 release candidate 中 Unobtrusive JavaScript and Validation 一节.
    • MVC 3 Release Notes

posted @ 2011-10-14 20:44 liwei823 阅读(1864) 评论(0) 推荐(0) 编辑

2011年9月19日

通过“四大行为”对WCF的扩展[实例篇]

摘要: 了让读者对如何利用相应的行为对WCF进行扩展有个深刻的认识,在这里我提供一个简单的实例演示。本实例模拟的场景是这样的:我们创建一个支持多语言的资源服务,该服务旨在为调用者提供基于某种语言的文本型资源。但是,我们不希望客户端在每次调用服务的时候都显式地制定具体的语言,而是根据客户端服务调用线程表示语言文化的上下文来自动识别所需的语言。[源代码从这里下载]要让资源服务具有识别语言文化的能够,我们必须将客户端服务调用线程当前的语言文化信息(具体来说就是Thread的两个属性:CurrentUICulture和CurrentCulture)自动传递到服务端。我们具体的实现原理是这样的:我们将客户端服务 阅读全文

posted @ 2011-09-19 21:46 liwei823 阅读(164) 评论(0) 推荐(0) 编辑

通过“四大行为”对WCF的扩展[原理篇]

摘要: 整个WCF框架由两个基本的层次构成,即服务模型层和信道层。对信道层的扩展主要通过针对绑定的扩展实现,具体来说就是自定义绑定元素,以及相关的信道管理器(信道监听器和信道工厂)、信道来改变对消息的处理和传输方式。而对于服务模式型层的扩展则主要体现服务端和客户端运行时框架的定制,进而让WCF按照我们希望的方式进行运作。由于整个运行时框架由一系列的可扩展组件构成,并且大部分运行时属性也可以改写,所以针对服务模型层的扩展具体体现在:根据具体的需要定义相应的组件,并以某种情形将这些自定义的组件应用到运行时框架相应的地方,或者按照我们希望的方式定制相应的运行时属性。而WCF为我们提供两种典型的应用自定义组件 阅读全文

posted @ 2011-09-19 21:45 liwei823 阅读(155) 评论(0) 推荐(0) 编辑

2011年9月14日

创建一个完整的分布式事务应用

摘要: 本篇文章将提供一个完整的分布式事务的WCF服务应用,通过本例,读者不仅仅会了解到如何编程实现事务型服务,还会获得其他相关的知识,比如DTC和AS-AT的配置等。本例还是沿用贯通本章的应用场景:银行转帐。我们将会创建一个BankingService服务,并将其中的转帐操作定义成事务型操作。我们先从物理部署的角度来了解一下BankingService服务,以及需要实现怎样的分布式事务。一、从部署的角度看分布式事务既然是实现分布式事务,那么事务会跨越多台机器。简单起见,我使用两台机器来模拟。有条件的读者可以在自己的局域网中进行练习,如果你没有局域网可用,你可以使用虚拟机来模拟局域网。假设两台机器名分 阅读全文

posted @ 2011-09-14 21:43 liwei823 阅读(465) 评论(1) 推荐(1) 编辑

WCF事务编程[下篇]

摘要: 在WCF事务编程模型下,通过服务契约确定事务流转的策略(参阅《上篇》),通过事务绑定实施事务的流转(参阅《中篇》)。但是,对于事务绑定接收到并成功创建的事务来说,服务操作的执行是否需要自动登记到该事务之中,以及服务操作采用怎样的提交方式,这就是服务端自己说了算了。正因为如此,WCF通过服务(操作)行为的形式定义事务的登记和提交(完成)方式。一、事务的自动登记(Enlistment)与提交(完成)在OperationBehaviorAttribute特性(其本身是一个操作行为)中定了两个与事务管理相关的属性:TransactionAutoComplete和TransactionScopeRequ 阅读全文

posted @ 2011-09-14 21:40 liwei823 阅读(173) 评论(0) 推荐(0) 编辑

WCF事务编程[中篇]

摘要: [续《上篇》]通过将TransactionFlowAttribute特性应用在服务契约的某个操作之上,并指定相应的TransactionFlowOption枚举直,仅仅定义了事务流转的策略而已。或者说,通过这种方式确定对事物流转的一种意愿,客户端是否愿意将当前事务流出,服务端是否愿意接受流入的事务,可以通过TransactionFlowAttribute特性进行控制。所以说,服务操作上定义个TransactionFlowAttribute特性是是否进行事务流转的总开关,真正的事务传播是建立在TransactionFlowOption.Allowed或者TransactionFlowOption 阅读全文

posted @ 2011-09-14 21:35 liwei823 阅读(203) 评论(0) 推荐(0) 编辑

WCF事务编程[上篇]

摘要: WCF事务编程其实很简单,可以用三句话进行概括:通过服务契约决定事物流转(Transaction Flow)的策略;通过绑定实施事务的流转;通过服务行为控制事务的相关行为。本篇文章着重介绍如果通过TransactionFlowAttribute特性定义事务流转策略。契约时是一种双边协定,是双方就某个关注点达成的一种共识。对于分布式事务的实现来讲,首先需要解决的是事务流转的问题,即事务将客户端的事务流向服务端。要解决事务流转的问题,需要在事务的发送方和接收方就流转问题达成共识,即双方采用相匹配的事务发送和接收策略。毫无疑问,这样的开关需要定义在服务契约之上,同时事务是基于服务操作的,所以事务流转 阅读全文

posted @ 2011-09-14 21:33 liwei823 阅读(174) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示