ASP.NET MVC3 RC2和一些小bug

來源:互聯網
上載者:User

@重典童鞋前幾天就在說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,我還是不大喜歡,或者不大適應。

留一下下載連結吧

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.