ASP.NET MVC實(shí)例和新RC版本中視圖方面的改進(jìn)
我們在www.asp.net網(wǎng)站上推出了一個新的ASP.NET MVC 設(shè)計(jì)陳列室。這個設(shè)計(jì)陳列室里陳列了你可以下載和輕易使用在你的ASP.NET MVC應(yīng)用中的免費(fèi)HTML設(shè)計(jì)模板。每個設(shè)計(jì)模板中包括了一個Site.master文件,一個CSS樣式表文件,也許還有一套圖片,用戶控件,以及支持它們的輔助方法等。
陳列室允許你在線預(yù)覽每個設(shè)計(jì),以及下載一個你可以解出和集成進(jìn)你的網(wǎng)站的模板.zip版本。該陳列室允許任何人在創(chuàng)作共用許可(creative commons license)下創(chuàng)建和提交新的設(shè)計(jì)。訪客可以對它們進(jìn)行投票,提供反饋。最受歡迎的設(shè)計(jì)會在陳列室的頂部顯示。
我們認(rèn)為這會給開發(fā)人員提供一個很有用的方式來更輕松地創(chuàng)建有吸引力的,與標(biāo)準(zhǔn)兼容的網(wǎng)站。希望還能鼓勵大家創(chuàng)建和共享可輕易為他人重用的設(shè)計(jì)。
即將推出的最終版候選版本中的View方面的改進(jìn)
說到UI這個話題,我想我也應(yīng)該與大家分享即將推出的ASP.NET MVC最終版候選版本(Release Candidate,簡稱RC)中的一些與視圖有關(guān)的改進(jìn)的細(xì)節(jié)。除了缺陷修補(bǔ)外,RC版本還融合了若干個特定于視圖的新功能和來自社區(qū)的建議。
不需要后臺代碼文件的視圖
基于許多人的反饋,我們決定做一個變動,這樣MVC視圖文件在默認(rèn)情形下不再擁有后臺代碼文件。這個變動有助于強(qiáng)化視圖在MVC世界中的目的(視圖意在純粹的顯示,不該包含任何與顯示無關(guān)的代碼),去掉項(xiàng)目中沒被使用的文件(對大多數(shù)人來說):
在ASP.NET MVC Beta版本中,開發(fā)人員可以通過在視圖中的Inherits(繼承)屬性上使用泛型的CLR句法來除去后臺代碼文件,但這個CLR句法,說得輕一點(diǎn)的話,非常難以發(fā)現(xiàn)而且非常難用。ASP.NET MVC開發(fā)團(tuán)隊(duì)結(jié)合了ASP.NET中現(xiàn)有的幾個擴(kuò)展性功能,將在ASP.NET RC版本中,在Inherits屬性中提供一個標(biāo)準(zhǔn)VB/C#語言句法:
不使用后臺代碼文件的另一個好處是,在你將視圖文件加到項(xiàng)目中時,你會馬上得到intellisense。在Beta版本中,你需要在創(chuàng)建視圖后做一次編譯才能在其中得到代碼intellisense。RC版本將使得添加和立刻編輯視圖的流程免去了編譯之累,變得更加緊湊。
#p#
視圖的頂級Model屬性
在ASP.NET MVC的早期版本中,你使用ViewData.Model屬性來訪問傳給視圖的強(qiáng)類型的模型對象:
上面的句法還是可用的,雖然現(xiàn)在ViewPage上還有一個頂級的Model屬性可為你所用:
這個屬性的作用跟先前的代碼例子是一樣的,它主要的好處在于它允許你編寫的代碼更加簡明。
HTML/AJAX輔助對象現(xiàn)在允許表達(dá)式句法
有一個不少人都提出的要求是,在使用視圖的HTML和AJAX輔助對象時,在指稱Model時使用強(qiáng)類型表達(dá)式的句法(而不是字符串)的能力。
在ASP.NET MVC Beta版本中,這是不可能的,因?yàn)镠tmlHelper和AjaxHelper輔助類并沒有在它們的簽名中呈示模型的類型,所以大家需要建造直接基于ViewPage
例如,我可以使用下面的代碼建造一個(非常簡單的)強(qiáng)類型TextBox輔助方法:
然后可以這樣,在我的任意一個視圖中,用它來綁定一個Product模型對象:
Visual Studio將在源代碼編輯器中操作View的模型時,以這種方式對強(qiáng)類型的表達(dá)式句法提供完整的intellisense:
注:核心ASP.NET MVC V1程序集中的HTML輔助擴(kuò)展還將使用現(xiàn)有的句法(不是基于表達(dá)式的),我們正計(jì)劃在MVCFutures程序集中加入基于表達(dá)式的版本。當(dāng)然,你還可以使用字符串或者強(qiáng)類型的表達(dá)式,來添加你自己的輔助方法。所有這些內(nèi)置的輔助方法都是可以去掉的(因?yàn)樗麄兪菙U(kuò)展方法),如果你要用自己的版本來替換或覆蓋它們的話。
#p#
Scaffolding支持
ASP.NET MVC RC版本還包括了在Visual Studio中使用新的ASP.NET MVC "Add View"命令創(chuàng)建視圖時的自動的"UI scaffolding" 支持。這個scaffolding支持將允許針對任何.NET 類型或?qū)ο蟮淖詣拥囊晥D生成,意味著它對POCO類,LINQ to SQL, LINQ to Entities, NHibernate, SubSonic, LLBLGen Pro,或者任何其他對象模型都工作。Scaffolding引擎使用了反射來獲取View的模型類型的公開接口,然后將它們傳給scaffolding模板,在生成的視圖中填充基于它的合適HTML標(biāo)識。
例如,假定我們有一個ProductsController類,想創(chuàng)建一個它的"Edit" action,來顯示特定產(chǎn)品的編輯視圖。使用RC版本,我們可以象這樣,在我們的"Edit" action方法中右擊,選擇"Add View"上下文菜單命令:
然后在"Add View" 對話框中,我們可以表示我們將把Product類型傳給我們的View:
我們可以表示我們要創(chuàng)建一個"Empty" 視圖模板(象上面那樣),或者表示我們要VS針對我們提供的Product對象自動提供一個"Edit"表單視圖的基本架子:
如果我們選擇"Edit" 模板, VS會自動為我們生成一個文件,該文件含有合適的HTML和驗(yàn)證輔助方法來生成一個可編輯的表單視圖:
然后我們可以運(yùn)行應(yīng)用,馬上得到一個編輯界面:
#p#
然后我們可以進(jìn)去,將生成的edit.aspx文件做任意改動。
我們發(fā)布的scaffolding系統(tǒng)的一個非常棒的東西是,它是使用Visual Studio的內(nèi)置T4代碼生成系統(tǒng)實(shí)現(xiàn)的(Scott Hanselman在這里有一篇非常好的相關(guān)博客)。隨ASP.NET MVC發(fā)布的"List(列表)", "Edit(編輯)", "Create(創(chuàng)建)" and "Details(細(xì)節(jié))" 模板可以做完全定制,或者用你自己的T4模板做替換(或者從ASP.NET MVC設(shè)計(jì)陳列室下載)。所以,如果你自己有特別的方式生成HTML的話,或者想要使用自定義的HTML輔助類(譬如,基于強(qiáng)類型表達(dá)式的輔助類),那你可以更新默認(rèn)的模板,然后scaffolding系統(tǒng)之后就會使用它們。
我們計(jì)劃允許模板可以在整個機(jī)器的層次,以及每個項(xiàng)目的層次上被置換(這樣,你可以在源碼控制中簽入特定于應(yīng)用的scaffolding模板,在團(tuán)隊(duì)成員間共享)。
編輯視圖的MSBuild任務(wù)
在默認(rèn)情形下,當(dāng)你編譯ASP.NET MVC項(xiàng)目時,它會編譯項(xiàng)目中除了視圖文件中代碼以外的所有代碼。在ASP.NET MVC Beta中,你想要編譯視圖的話,你需要編寫你自己的 MSBuild任務(wù)。ASP.NET MVC RC版本現(xiàn)在包含了一個內(nèi)置的 MSBuild 任務(wù),你可以用它來將視圖包括成為項(xiàng)目編譯過程的一部分。它會核實(shí)應(yīng)用中所有視圖和母版頁的句法和行內(nèi)代碼,如果遇到問題的話,它會給你編譯錯誤信息。
但因?yàn)樾阅艿木壒剩覀儾唤ㄗh在開發(fā)期間運(yùn)行它來做快速編譯,但將它加到特定的編譯配置(例如,staging和部署)或者在與 Build 或 CI (連續(xù)集成)服務(wù)器一起使用時是非常方便的。
即將推出的ASP.NET MVC RC版本的其他一些功能
上面是RC版本中一些特定于視圖的功能的簡短列表。
在RC版本中,還有許多其他的功能和要求,這些包括:IDataErrorInfo支持,允許模型匯報驗(yàn)證錯誤信息,以及更豐富的錯誤驗(yàn)證擴(kuò)展性以允許你使用自己的方式來匯報模型驗(yàn)證信息到ModelBinders中(IDataErrorInfo支持是建造在這個的基礎(chǔ)之上的);新的FileResult和JavaScriptResult的ActionResult 類型(允許你更輕松地下載文件和可執(zhí)行的JavaScript到瀏覽器中);內(nèi)置的 jQuery -vsdoc intellisense支持;重構(gòu)了的AccountController支持,以促成更簡單的表單登錄場景的單元測試和擴(kuò)展性;各種各樣的項(xiàng)目模板改進(jìn),隨處可見的眾多擴(kuò)展性;諸多的缺陷修補(bǔ)等。
【編輯推薦】