ASP.NET MVC V2 Preview 1 發布 期望VS有更好的表現

來源:互聯網
上載者:User

ASP.NET MVC V2 Preview 1官方首頁:http://aspnet.codeplex.com/ 在這裡可以下載

以下是網友的轉載,介紹的還是比較詳細的:

預覽版是在.NET 3.5 SP1和VS 2008下工作的,可與ASP.NET MVC 1.0並行安裝在同一個機器上(即,它們不相衝突,如果你安裝2.0的話,你現有的ASP.NET MVC 1.0項目不會受影響)。如果你同時安裝ASP.NET MVC 1.0 和 ASP.NET MVC 2.0的話,你會在Visual Studio 2008的 “新項目” 對話方塊中看到2個ASP.NET MVC項目模板:

DataAnnotation(資料標記)驗證支援

 ASP.NET MVC 2現在包含了對最先在.NET 3.5 SP1中發布的DataAnnotation驗證的內建支援,這個東西是在ASP.NET動態資料和.NET RIA服務中使用的。DataAnnotation提供了一個簡易的方式,可以聲明的方式在應用中的Model(模型)和ViewModel(視圖模型)類中添加驗證規則,在ASP.NET MVC中有自動的綁定和UI輔助方法驗證支援。

 要看該特性如何在實際中使用,我們可以象下面這樣建立一個新的“Customer” 視圖模型類,內含5個屬性(是用了C#特性之一 -- 自動屬性來實現的)。

 然後,我們可以使用System.ComponentModel.DataAnnotations命名空間下的DataAnnotation特性,在這些屬性上飾於適當的驗證規則。下面的代碼使用了4種不同的內建驗證規則: Required], [StringLength], [Range], 和 [RegularExpression]。該命名空間下還包括一個基類,ValidationAttribute, 你可以繼承來建立你自己的定製驗證特性。

 然後,我們可以建立一個CustomersController類,其中有2個 Create action方法。第一個 Create action方法處理對應於“/Customers/Create” URL的HTTP GET請求,基於一個空白的Customer對象顯示一個視圖模板。第二個 Create action方法則處理同個URL的HTTP POST請求,並接受一個Customer對象作為方法參數。它會檢查提交的輸入資料是否造成了任何模型繫結錯誤,如果造成了錯誤的話,它會使用已經輸入的資料重新顯示視圖模板,如果沒錯誤的話,它會給使用者顯示一個提交成功了的視圖:

 ASP.NET MVC 2預覽版的發布說明詳述了如何將現有的ASP.NET MVC 1.0項目升級到使用V2,如果你想將它們移植來利用V2的新特性的話。

新特性

 ASP.NET MVC V2將包括一堆新功能和特性(其中一些已經在ASP.NET MVC產品路線圖網頁上列出了)。今天的“第一個預覽版”包括的一些新特性還是第一次露面,更多的特性將在將來的預覽版中出現。第一個預覽版的代碼還屬於早期版本,Team Dev今天發布這個版本,意在開始徵詢大家的反饋,並將它們融入將來的版本。

 下面簡短地說明一下其中一些新功能:

 地區支援

 ASP.NET MVC 2將支援一個叫“地區(areas)”的新特性,允許你輕鬆地將MVC應用的功能進行分割和組合。

 “地區”提供了一個將控制器和視圖進行分組的方式,允許你把一個大應用的各個子部分相對獨立地進行構建。每個地區可以一個單獨的ASP.NET MVC項目的形式來實現,並且這些項目可進而為主應用所引用。這在建造大應用時有助於管理其複雜性,並方便多個團隊合作開發應用。

 下面這個螢幕展示一個單一解決方案中有三個項目。其中一個項目叫“CompanySite”(公司網站),包括了核心的網站內容,布局,相關的控制器和視圖。還有2個單獨的“地區”項目: “Blogs”(部落格) 和 “Forums” (論壇)。這2個項目實現了網站的/Blogs 和 /Forums URL下的功能,封裝了所有的路徑規則,以及實現這2個部分的控制器和視圖:

 第一個預覽版只包括了地區特性實現的第一個部分,還不包括任何工具支援(目前,你只能手工添加編譯任務來建立並配置地區項目)。將來的預覽版本將包括工具支援,同時進一步將功能集擴大和完善。

最後,我們可以在上面任意一個Create action方法中右擊,選擇 “添加視圖”操作功能表命令,自動地產生(scaffold)一個基於Customer對象的“Create”視圖模板的架構。這麼做的話,產生的架構視圖模板會包含下面這樣一個HTML <form>:

 這樣,當我們在瀏覽器中請求“/Customers/Create” URL時,我們會得到象下面這樣起始的空白表單:

 如果我們輸入不合法的資料,提交到伺服器時,ASP.NET MVC 2模型繫結器會檢測到我們的Customer類上有DataAnnotations特性,會自動地使用它們對提交的表單輸入資料進行驗證。如果有錯誤的話,我們的控制器action方法會重新顯示表單,並且給使用者顯示適當的驗證錯誤訊息,象下面這樣。注意我們使用DataAnnotation特性指定的驗證屬性錯誤訊息字串是如何通過Html.Validation輔助方法顯示給使用者的,不用編寫額外的代碼就可以實現。

 The above form will redisplay with error messages each time the user enters invalid input and attempts to perform a form post.

 在將來的ASP.NET MVC 2預覽版中,我們計劃將jQuery驗證外掛程式作為預設項目模板的一部分來發布,同時添加DataAnnotation驗證規則在用戶端JavaScript中自動強制執行的支援。這將允許開發人員輕鬆地在一個地方,Model或ViewModel對象上,添加驗證規則,然後無論對象用在應用中的什麼地方,這些規則都會同時在用戶端和伺服器端強制執行。

 如果你不希望直接標記你的模型或視圖模型類,你還可以建立一個伴隨你的模型類的“夥伴類(buddy class)”,另外封裝DataAnnotaton規則。這個功能還在這樣一些情境下有用: VS直接產生/更新類的屬性代碼,你無法簡易地在產生的程式碼上飾以特性(例如,由LINQ to SQL 或 LINQ to Entities設計器產生的類)。

 除了提供對DataAnnotations的內建支援外,ASP.NET MVC V2中的DefaultModelBinder類現在還有新的虛擬方法,可以在子類中覆蓋,來輕鬆地整合其他的驗證架構( 例如Castle Validator, EntLib Validation等等)。ASP.NET MVC中的驗證UI輔助方法是設計來支援任何類型的驗證架構的(它們不用知道DataAnnotations)。

強型別UI輔助方法

 ASP.NET MVC V2包含了新的HTML UI輔助方法,這些輔助方法允許你在引用視圖模板的模型對象時使用強型別的lambda運算式。這可以促成更好的視圖編譯時間檢查(這樣缺陷是在編譯時間發現而不是在運行時發現),還能促成視圖模板中更好的代碼intellisense支援。

 你可以在下面看到一個示範更好intellisense的例子,注意我在使用新的Html.EditorFor()輔助方法時是如何得到Customer模型對象屬性的完整列表的:

 第一個預覽版提供對新的Html.EditorFor(), Html.LabelFor(), 和 Html.DisplayFor() 輔助方法的內建支援。將在這個星期發布的更新過的MVC Futures程式集還將包含對另外的Html.TextBoxFor(), Html.TextAreaFor(), Html.DropDownListFor(), Html.HiddenFor(), 和 Html.ValidationMessageFor()輔助方法的支援(隨著時間的推移,這些方法也會移到核心ASP.NET MVC 2程式集中去)。

 在下面,你可以看到Customer建立情境下“Create”視圖模板的一個更新了的版本。注意,在UI輔助方法中,我們不是使用字串運算式來引用Customer對象,而是使用強型別的lambda運算式。我們在所有這些方法中都可以得到完整的 intellisense 和 編譯時間檢查:

 上面的Html.LabelFor()輔助方法產生<label for="Name">Name:</label> HTML 標識。

 Html.EditorFor()輔助方法可以用於任何資料類型值。在預設情形下,它很聰明,會根據要編輯的類型輸出合適的HTML <input/>元素。譬如,它會為上面的前4個屬性(是字串和整數類型)產生<input type=”text”/>元素,會為最後的那個“IsActive” 屬性產生<input type=”checkbox”/>元素,因為這個屬性是布爾實值型別。

 除了支援簡單的資料類型外,Html.EditorFor()輔助方法還允許你傳遞給它擁有多個屬性的比較複雜的對象。在預設情形下,它會對對象的所有公開屬性進行迴圈,輸出<label>, <input/> 元素,以及它能找到的每個屬性的任何合適的驗證訊息。例如,我們可以重寫上面的視圖,對Customer對象只做單個Html.EditorFor()調用,從概念上來說輸出跟上面一樣的標識:

 強型別的輔助方法允許你在Customer視圖類的屬性上飾以[DisplayName]特性,來控製為每個屬性輸出的標籤字串(例如:不是用“IsActive”作為標籤文字,我們可以加一個[DisplayName(“Is Active Customer:”)]特性)。

 你也可以加一個[ScaffoldColumn(false)]特性,來表示,在象上面把一個複雜的對象傳給Html.EditorFor()那樣的情境下,某個特定的屬性完全不應該顯示出來。

UI 輔助方法樣板化支援

 Html.EditorFor() 和 Html.DisplayFor() 輔助方法對顯示標準的資料類型以及含有多個屬性的複雜物件有內建的支援。就象上面說的,它們還支援通過在視圖模型上施加象[DisplayName]和 [ScaffoldColumn]特性這樣的基本的定製機制。

 但經常地,開發人員想要能夠進一步定製UI輔助方法的輸出,對產生的東西要有完全的控制。Html.EditorFor() 和 Html.DisplayFor()輔助方法通過一個模板化機制支援這個要求,這個機制允許你定義外部的模板,替換原先的,完全控制顯示的輸出。更棒的是,你還可以在每個資料類型/類的基礎上定製要顯示的內容。

 在第一個預覽版中,你可以在\Views\[控制器名稱]目錄下(如果你想要定製某個特定的控制器所用視圖的顯示的話)或在\Views\Shared目錄下(如果你想要定製一個應用中所有視圖和控制器的顯示的話)加一個“EditorTemplates” 或者 “DisplayTemplates” 子目錄。

 然後你可以往這些目錄中加分模板(partial template)檔案,針對個別資料類型或者類來定製顯示輸出。例如,在下面,我在\Views\Shared目錄下加了一個EditorTemplates子目錄,在其中加了三個定製的模板檔案:

 上面的“Customer.ascx”模板表示我想要定製在調用Html.EditorFor()時其參數為Customer對象時的輸出(例如,我可以定製Customer屬性的精確順序和布局)。上面的“DateTime.ascx” 模板表示我想要定製在調用Html.EditorFor()時其參數為DateTime屬性時的輸出(例如,我也許想要使用JavaScript的日曆控制項,而不是普通的文字框)。我也可以在目錄中加一個“Object.ascx” 模板,如果我想要替代所有對象的預設顯示的。

 除了在每個類的基礎上定製輸出外,你還可以在目錄中加“具名模板(named templates)”。一個常見的情境也許是 “CountryDropDown”模板,它處理字串資料型別,但不是提供標準的文字框,而是顯示一個使用者可以選擇的列出了國家名稱值的<select>下拉框。下面是這個編輯器模板的一個例子:

 然後,我們可以在調用Html.EditorFor()輔助方法時,把上面這個模板的名稱作為參數傳給它,明確地表示我們想要使用這個模板。例如,在下面,除了指定Country屬性的lambda運算式外,我們還指定了在顯示時要使用的編輯器模板的名稱:

 或者,你也可以在你的ViewModel屬性和類型上指定“UIHint”特性。這允許你在單一一個地方指定要使用的預設編輯器或者顯示器模板,然後在整個應用的所有視圖中使用指定的模板(而不必顯式地將這個名稱作為參數傳給Html.EditorFor)。

 下面是一個如何使用UIHint特性來表示Customer.Country屬性(字串類型)應該在預設情形下顯示時使用CountryDropDown模板的例子:

 一旦在我們的視圖模型上設定上述特性後,在使用Html.EditorFor()顯示那個屬性時,我們就不再需要顯式指定模板名稱了。現在,在/Customers/Create URL上點擊重新整理時,我們的Country屬性就會顯示為一個下拉框,而不是一個標準的文字框:

 其他酷特性

 ASP.NET MVC 2第一個預覽版還包含了若干個雖小但是很妙的特性。我最喜愛的幾個包括:

 新的[HttpPost]特性

 在 ASP.NET MVC中,把一個URL的處理分成2個action方法的做法是非常常見的,其中一個處理GET請求,另一個處理POST請求。

 在ASP.NET MVC 1中,你使用[AcceptVerbs(HttpVerbs.Post)]特性來表示action方法的“Post”版本:

 在ASP.NET MVC 2中這依然工作,但你現在也可以利用更簡潔的[HttpPost]特性來做同樣的事情:

 預設參數值

 處理可省參數在web情境中是司空見慣的事。在ASP.NET MVC 1中,處理可省參數一般有2個做法,通過註冊定製的路徑規則,在其中指定預設的值,或者將某個action方法的參數標記為nullable,然後在action方法中添加代碼處理該參數是否是null(如果是null就提供預設值)。

 ASP.NET MVC 2第一個預覽版現在支援在action方法的參數上飾以System.ComponentModel命名空間下的DefaultValueAttribute。這允許你在某個參數不在請求值中時指定ASP.NET MVC應該傳給action方法的參數值。例如,下面是一個我們可以如何處理 /Products/Browse/Beverages 和 /Products/Browse/Beverages?page=2 URLs的例子,如果“page”參數不是查詢字串的一部分時,其值為“1”:

 VB今天就允許你直接在語言中指定預設的參數值(而不必象上面那樣顯式指定DefaultValue特性),VS2010中的C#語言也將支援可省參數的預設值,將允許我們把上面的代碼簡化成:

 這應該會使處理預設/可省情境變得非常地乾淨利落。

 綁定位元據

 ASP.NET MVC 2的第一個預覽版還加了支援綁定base64編碼的字串值到類型為byte[]和System.Data.Linq.Binary的屬性。現在還有2個可以接受這些資料類型的重載的Html.Hidden()版本。在你想要在應用中啟用並發性控制,在表單中來回傳送資料庫行記錄的時間戳記(timestamp)值的情境下,這會非常有用。

 結語

 點擊這裡下載包含一個ASP.NET MVC 2項目的.zip檔案,該項目實現了我在上面示範的範例。

 今天的ASP.NET MVC 2版本還只是第一個預覽版,將來的預覽版中將包括更多的特性,Team Dev期待在如何改進和增強功能方面得到許許多多的反饋。

 有規律地發布這些預覽版的目的是想協助確保這個反饋過程是開放的,任何想參與的人都可以輕易地參與。請在www.asp.net的ASP.NET MVC論壇上發貼提反饋,建議或者貼出你遇到的問題等。 你也可以從Phil Haack的MVC2貼子 和 Phil和 Scott Hanselman在Channel9錄製的關於第一個預覽版的錄影中瞭解這個預覽版的詳情。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.