阿不

潜水

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  212 随笔 :: 0 文章 :: 3067 评论 :: 75 引用

公告

@重典童鞋前几天就在说ASP.NET MVC3 RC2已经发布了,我赶紧上网去找发布消息,没有相关的发布消息,回过头才知道是只对部分订阅用户开发下载。不过按这个时间点来看,对外发布也已经不远了,果然在周五的时候,Scottgu按照惯例在它的博客上正式发表一个发布公告以及相关的Releas Notes细节,Announcing ASP.NET MVC 3 (Release Candidate 2),同时它还简单的介绍了刚刚发布的VS2010 beta1对MVC3的影响,其实也只是说明一下MVC3可以工作在VS2010和VS2010 Beta1环境下。

老早以前就对MVC3虎视眈眈了,但是由于现在不是我们的MVC框架升级会影响好几个项目,不得不一再推迟跟进。直到RC版本发布的时候才尝试升级一下,结果因为FormCollection的RequestValidation验证问题而不得不半途放弃。很快,一个月过去了,MVC2 也出了RC2了,我们先来看看,它都做了些什么改动吧。

  • Bugs的修复和性能的调优。Bugs的修复是版本更新的第一目标,上面的提到的bug在我的验证中已经被解决了,但是又引入了另一个bug 悲伤,稍后再抱怨。性能的调优,@ScottGu只是简单的带过一句,说MVC3的性能较MVC2有小幅的提升,但是没有说明具体的数值。
  • 更新jquery到1.4.4,jquery validation到1.7,同时在ASP.NET MVC3开始还将默认添加对jquery ui的引用。由此可见,jquery越来越受到重用了。我喜欢,不过,如果能把ASP.NET AJAX脚本去掉,默认的环境使用jquery来构建,我就更喜欢了,省是我麻烦,呵呵。
  • 改进View脚手架的,包括自动识别主键和自动引用jquery脚本(其实我不喜欢)。
  • ControllerSessionState重命名为SessionState,这个Attribute可以让我们手动禁用/只读Session。
  • SkipRequestValidation重命名为AllowHtml,这个Attribute,可以允许我们在Model中,直接忽略对某个字段进行RequestValidation验证。但是这个功能在RC2中,并不能正常工作,出Bug了。这两个重命名,主要都是为了让Attribute名称更短,更符合人们对它实际效果的认识,减少技术性的命名。
  • Html.Raw() ,这个Helper主要是用于Razor模板引擎。因为Razor的@输出,会默认先调用Html.Encode,对Html进行编码,防止XSS漏洞,但是有时候我们希望直接就输出原始值,这时候你就可以调用Html.Raw()。在ASPX引擎中,我们有<%: %>和<%= %>。
  • dynamic类型的ViewBag,这是一个非常有趣的功能。不管此版本之前是怎样的,在此版本中,Controller和View中都有一个ViewBag对象,这个对象是一个dynamic对象,让我们可以传统对象使用的方式来动态添加属性,比如在Controller中,我们可以这个添加一个属性:ViewBag.Title。然后在View中,直接这样使用:@ViewBag.Title,这样总会比Dictionary的方式来使用方便的多。其实,ViewBag,只是对ViewData的一个封装而已,它们实际上是使用相同的对象。因为ASP.NET MVC2,是构建在.NET 3.5之上,没有dynamic语法,而MVC3开始,就只支持.NET 4.0了。
  • 输出缓存的改进,OutputCache不需要手动指定VaryByParam,会自动使用Action的参数作为缓存过期条件。OutputCache功能我目前还没有用过。
  • @model,Razor的强类型View的定义行,不再输出一个空格。
  • Html.ValidationMessage的改进,优先显示“最有价值”的错误消息,而不是简单的显示第一个错误消息。那么什么是“最有价值”的优先错误消息呢?在模型绑定的时候,在ModelState中,会保存多种错误消息,包括实现IValidatableObject接口的Validate返回值,作用在属性上的ValidationAttribute验证消息,和访问该属性时触发的异常。而在一般情况下,异常并不是提供给最终用户的,而是给开发人员调试使用的。因此,在显示错误消息时,优先显示不带异常的错误消息。只有在没有这错误消息的时候,才会显示一个带异常的通用提示消息。多讲一点,正常因为基本.NET 4.0,才会有IValidatableObject这个接口,它在4.0的DataAnnotations程序集内,基于.NET 4.0太重要了。
  • RemoteAttribute,快速实现AJAX服务器端验证,这个Attribute也会相当有用。
  • ViewResult,包含有Model和ViewBag两个属性。
  • AdditionalMetadataAttribute,这个Attribute也是相当重要的。很多时候,我们需要在ModelMetadata中,添加已存在的属性以外的额外值相当的麻烦,而且也不一定是其它属性所必须的。这时候AdditionalMetadataAttribute的作用就相当大:
    public class ProductViewModel {
      [AdditionalMetadata("AdminOnly", true)]
      public string RefundCode {get; set;}
    }
    

    这样我们就可以通过ModelMetadata.AdditionalValues得到我们额外定义的元数据。

  • LabelFor的改进,更符合W3C标准,label for的值应该是element的id,而不是name。

我基本把重要的Release Notes列了一遍,其中最后两点是ScottGu没有提到的,更详细的可以看完整的Release Notes。下面有一个小抱怨,刚刚在验证FormCollection的验证bug是否修复的时候,出现了另一个bug。就是我在属性上使用AllowHtml时,不像文档所介绍的那样,可以允许输入Html值,仍然会报验证异常。起初还以为我仍然需要设置requestValidationMode=2.0,使用ASP.NET 2.0的验证模式。网上一查,才知道,这又是一个已知的bug,还好,解决方案并不复杂,我们只需要修改一下ModelMetadataProvider:

ModelMetadataProviders.Current = new DataAnnotationsModelMetadataProvider(); 

这个bug的原因是由于默认使用了System.Web.Mvc.CachedDataAnnotationsModelMetadataProvider,我们改这段代码并不会影响MVC3的其它功能,只是ModelMetadata没有了缓存。可能也是因为在MVC3增加了类似的缓存,才提高了运行速度了吧? 微笑

不得不说,在MVC3中,我们已经不需要设置requestValidationMode=2.0了,这个相当的重要!

按照官方说法,MVC3 RTM会在1月份发布。如果R2没有其它的bug,我还是很愿意升级,毕竟进步还是很大的。不过就是unobtrusive js,我还是不大喜欢,或者不大适应。

留一下下载链接吧

posted on 2010-12-12 20:38 阿不 阅读(...) 评论(...) 编辑 收藏