現(xiàn)在我們創(chuàng)建一個具體的Model對象并通過如下的形式將Foo屬性以編輯模式呈現(xiàn)在某個基于Model類型的強類型View中。
@model Model @Html.EditorFor(m=>m.Foo) 如下所示的代碼片斷表示Model的Foo屬性呈現(xiàn)在UI界面中的HTML(“dummy text …”是是Foo的屬性值),我們可以看到這是一個< textarea >元素。表示CSS樣式類型的class屬性被設置為“text-box multi-line”,意味著它是以多行的效果呈現(xiàn)。
Password
對于表示密碼字符串來說,在編輯模式下應該呈現(xiàn)為一個類型為“password”的 元素,使我們輸入的內(nèi)容以掩碼的形式顯示出來以保護密碼的安全性。在這種情況下我們可以采用Password模板,該模板和MultilineText一樣也僅限于編輯模式。如下面的代碼片斷所示,我們在Model的Foo屬性上應用UIHintAttribute特性將模式名稱設置為“Password”。
public class Model { [UIHint("Password")] public string Foo { get; set; } } 我們創(chuàng)建一個具體的Model對象,并通過如下的形式將Foo屬性以編輯模式呈現(xiàn)在某個基于Model的強類型View中。
@model Model @Html.EditorFor(m=>m.Foo) 該Foo屬性最終會以如下的形式通過一個類型為“Password”的 元素呈現(xiàn)出來,表示CSS樣式類型的class屬性被設置為“text-box single-line password”,意味著呈現(xiàn)效果為一個單行的文本框。
Decimal
如果采用Decimal模板,代表目標元素的數(shù)字不論其小數(shù)位數(shù)是多少,都會最終被格式化為兩位小數(shù)。在顯示模式下,被格式化的數(shù)字直接以文本的形式呈現(xiàn)出來;在編輯模式下則對應著一個單行的文本框架。如下面的代碼片斷所示,我們在數(shù)據(jù)類型Model中定義了兩個對象類型屬性Foo和Bar,上面應用了UIHintAttribute特性并將模板名稱指定為“Decimal”。
public class Model { [UIHint("Decimal")] public object Foo { get; set; } [UIHint("Decimal")] public object Bar { get; set; } } 我們創(chuàng)建一個具體的Model對象,將它的Foo和屬性分別設置為整數(shù)123和浮點數(shù)3.1415(4位小數(shù)),最終通過如下的形式將它們以顯示和編輯的模式呈現(xiàn)在一個基于Model類型的強類型View中。
@model Model @Html.DisplayFor(m=>m.Foo) @Html.DisplayFor(m=>m.Bar) @Html.EditorFor(m=>m.Foo) @Html.EditorFor(m =>m.Bar) 上述四個元素在最終呈現(xiàn)的UI界面中對應著如下的HTML,我們可以看到最終顯示的都是具有兩位小數(shù)的數(shù)字。
123.00 3.14 Boolean
通過本章最開始的實例演示我們知道一個布爾類型的對象在編輯模式下會以一個類型為“checkbox”的 元素的形式呈現(xiàn),實際上在顯示模式下它依然對應著這么一個元素,只是其disabled屬性會被設置為True使之處于只讀狀態(tài)。布爾類型的這種默認呈現(xiàn)方式源自“Boolean”模板默認被使用。
當布爾類的目標元素以編輯模式進行呈現(xiàn)的時候,除了生成一個一個類型為“checkbox”的 元素之外還會附加產(chǎn)生一個類型為“hidden”的 元素。如下面的代碼片斷所示,這個hidden元素具有與CheckBox相同的名稱,但是值為False,它存在的目的在于當CheckBox沒有被勾選的情況下通過對應的hidden元素向服務區(qū)提交相應的值(False),因為沒有被勾選的CheckBox的值是不會包含在請求中的。
Boolean和String、Decimal以及后面我們介紹的Object一樣屬于是基于CLR類型的模板。由于ASP.NET在內(nèi)部采用基于類型的模板匹配策略,如果沒有顯示設置采用的模板類型,相應類型的元素會默認采用與之匹配的模板。
Collection
顧名思義,Collection模板用于集合類型的目標元素的顯示與編輯。對應采用該模板的類型為集合(實現(xiàn)了IEnumerable接口)的目標元素,在調(diào)用HtmlHelper或者HtmlHelper以顯示或者編輯模式對其進行呈現(xiàn)的時候,會遍歷其中的每個元素,并根據(jù)基于集合元素的Model元數(shù)據(jù)決定對其的呈現(xiàn)方法。同樣一我們定義的數(shù)據(jù)類型Model為例,我們按照如下的方式將它的Foo屬性類型改為對象數(shù)組,上面應用了UIHintAttribute特性并將模板名稱 設置為“Collection”。
public class Model { [UIHint("Collection")] public object[] Foo { get; set; } } 然后我們按照如下的方式創(chuàng)建一個包含三個對象的數(shù)組,作為數(shù)據(jù)元素的三個對象類型為別是數(shù)字、字符串和布爾,然后將該數(shù)組作為Foo屬性創(chuàng)建一個具體的Model對象。
object[] foo = new object[] { 123.00, "dummy text ...", true }; Model model = new Model { Foo = foo }; 在一個基于Model類型的強類型View中,我們分別調(diào)用HtmlHelper的DisplayFor和EditorFor方法將上面創(chuàng)建的Model對象的Foo屬性以顯示和編輯模式呈現(xiàn)出來。
@model Model @Html.DisplayFor(m=>m.Foo) @Html.EditorFor(m=>m.Foo) Model對象的Foo屬性最終呈現(xiàn)出來的HTML如下所示,我們可以看到不論是顯示模式還是編輯模式,基本上就是對集合元素呈現(xiàn)的HTML的組合而已。
123dummy text ... Object
我們說過,ASP.NET 內(nèi)部采用基于類型的模板匹配策略,如果通過ModelMetadata對象表示的Model元數(shù)據(jù)不能找到一個具體的模板,最終都會落到Object模板上。Object模板對目標對象的呈現(xiàn)方式很簡單,它通過ModelMetadata的Proeprties屬性得到所有基于屬性的Model元數(shù)據(jù)。針對每個表示屬性Model元數(shù)據(jù)的ModelMetadata,它會根據(jù)DisplayName或者屬性名稱生成一個標簽(實際上是一個內(nèi)部文本為顯示名稱的
元素),然后根據(jù)元數(shù)據(jù)將屬性值以顯示或者編輯的模式呈現(xiàn)出來。
public class Address { [DisplayName("省")] public string Province { get; set; } [DisplayName("市")] public string City { get; set; } [DisplayName("區(qū)")] public string District { get; set; } [DisplayName("街道")] public string Street { get; set; } } 針對上面定義得這個表示地址的Address。現(xiàn)在我們創(chuàng)建一個具體的Address對象并通過如下的方式調(diào)用HtmlHelper的DisplayForModel方法將它呈現(xiàn)在以此作為Model的View中。
@model Address @Html.DisplayForModel() 從如下所示的HTML中我們可以看出作為Model的Address對象的所有屬性都以顯示模式呈現(xiàn)出來,而在前面還具有相應的標簽。
省
江蘇省
市
蘇州市
區(qū)
工業(yè)園區(qū)
街道
星湖街328號
值得一提的是,Object模板在對屬性進行遍歷的過程中,不論是顯示模式還是編輯模式,只會處理非復雜類型。也就是如果屬性成員是一個復雜類型(不能支持從字符串類型的轉(zhuǎn)換),它不會出現(xiàn)在最終生成的HTML中。
public class Contact { [DisplayName("姓名")] public string Name { get; set; } [DisplayName("電話")] public string PhoneNo { get; set; } [DisplayName("Email地址")] public string EmailAddress { get; set; } [DisplayName("聯(lián)系地址")] public Address Address { get; set; } } 通過上面的代碼片斷,我們定義了一個表示聯(lián)系人的數(shù)據(jù)類型Contact,它具有一個類型的Address的同名屬性?,F(xiàn)在我們創(chuàng)建一個具體的Contact對象,并 對包括Address 屬性在內(nèi)的所有屬性進行初始化,然后通過如下的方式通過調(diào)用HtmlHelper的DisplayForModel方法將它呈現(xiàn)在以此作為Model的View中。
@model Contact @Html.DisplayForModel() 從如下所示的HTML可以看出,Contact的數(shù)據(jù)成員Address由于是復雜類型,其內(nèi)容并不會呈現(xiàn)出來。
姓名
張三
電話
1234567890
Email地址
zhangsan@gmail.com
我們可以有兩種方式解決這個問題,其實就是通過為Address類型定義各類專門的模板用于地址信息的顯示和編輯,通過UIHintAttribute特性將此模板名稱應用到Contact的Address屬性上,然后調(diào)用DisplayFor/EditorFor將該屬性呈現(xiàn)出來。另一種就是按照類似如如下的方式手工將負責類型屬性成員呈現(xiàn)出來。
@model Contact @Html.DisplayForModel() @Html.DisplayName("Address")
@(Model.Address.Province + Model.Address.City + Model.Address.District+ Model.Address.Street)
關(guān)于ASP.NET 中怎么預定義模板就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
標題名稱:ASP.NET中怎么預定義模板
本文URL:
http://weahome.cn/article/psciij.html
在線咨詢
微信咨詢
電話咨詢
028-86922220(工作日)
18980820575(7×24)
提交需求
返回頂部