Asp.Net MVC4.0 官方教程拓展之一–為模型屬性增加中文顯示名稱

來源:互聯網
上載者:User

官方教程已經翻譯完了,在此基礎上,再做一些拓展,目標是做本土化調整,適合國內項目開發的現狀,比如,對英語國家來說,庫表欄位名、模型屬性名稱、頁面顯示名都可以一樣,完全沒必要區分出來,而對於國內來說,顯示的列表頁面欄位標題欄或是詳細頁面的欄位說明是中文的,庫表裡儲存的欄位和模型屬性是英文。目前沒有明確的規劃,想到哪寫到哪,來源也雜,有查閱英文資料,有參閱前人寫過的文章,還有自己摸索的,先寫,最終再整理排序。

本文我們就來解決一下上文提到的如何為模型屬性增加中文顯示名稱的問題。在官方教程的例子中,你會發現MVC已經做了漢化,但是漢化並不完全,比如很多自動產生的按鈕和連結,都是英文的。在列表頁面,欄位標題欄是英文名稱,詳細頁面的欄位說明,也是英文的,很明顯,不能將這樣的展示作為最終效果交付。

首先我們來看一下官方教程中產生的Movie的Index視圖,開啟Views/Movie/Index.cshtml檔案,腳手架自動產生的列表頁面表格的表頭如下所示:

    <tr>        <th>            @Html.DisplayNameFor(model => model.Name)        </th>        <th>            @Html.DisplayNameFor(model => model.Genra)        </th>        <th>            @Html.DisplayNameFor(model => model.Price)        </th>         <th>            @Html.DisplayNameFor(model => model.Rating)        </th>        <th>            @Html.DisplayNameFor(model => model.Date)        </th>        <th></th>    </tr>

要進行漢化,最笨的辦法是直接修改視圖,例如將@Html.DisplayNameFor(model => model.Name)修改為“影片名稱”。這樣做可以實現漢化效果,但是非常繁瑣,耗時耗力且易出錯。列比較多的情況下,容易發生列對應錯位問題。若要修改屬性的中文顯示名稱,同樣需要在CRUD多個視圖進行手工調整,工作量顯而易見是很大的。而且,也違背前面所提到的“乾爽”(DRY)原則。

由前面教程中為模型增加驗證屬性,我們可以得到啟發,是不是可以僅在模型類中定義中文顯示名稱一次,而在各個視圖中自動應用呢?事實上,MVC已經做了該方面的處理工作。由上面代碼可以知道,腳手架機制並沒有在視圖代碼中寫死,直接在欄位標題中寫Name/Genra等,而是調用了Html助手類的DisplayNameFor方法,傳入模型屬性,擷取顯示名稱。你僅需要在模型類中為屬性增加中文顯示名稱屬性即可。具體做法是,開啟Models/Movies.cs,增加Display屬性,代碼如下所示:

    public class Movie    {        public int ID { get; set; }               [Display(Name="片名")]        public string Name { get; set; }        [Display(Name = "風格")]        public string Genra { get; set; }        [Display(Name = "價格")]        public decimal Price { get; set; }            [Display(Name = "上映日期")]        public DateTime Date { get; set; }          [Display(Name = "評價")]        public string Rating { get; set; }    }

即為模型屬性增加Display,設定參數Name值為要顯示的中文名稱。修改後執行產生項目操作,運行,可以看到,列表頁面以及增刪改頁面都自動生效了,顯示的是中文欄位名稱。

查看Display屬性官方協助如下:
命名空間: System.ComponentModel.DataAnnotations

DisplayAttribute 類:提供一個通用特性,使您可以為實體部分類別的類型和成員指定可本地化的字串。

上文我們使用的Name參數,其實遠遠不止這些,本想在下面挑幾個實用的來說一下,比如第一個AutoGenerateField,官方說明是擷取或設定一個值,該值指示是否應自動產生使用者介面以顯示此欄位。

在實際業務開發中,往往有些欄位是隱藏用於幕後處理的,不需要也不應該顯示給使用者,於是嘗試性加了,如下

[Display(AutoGenerateField = false, Name = "風格")]
public string Genra { get; set; }

 結果……發現無論如何,該參數無法生效……設定參數AutoGenerateField 為false的Genra ,編譯和運行都未報錯或者警告,但是運行結果是,始終會在視圖中自動產生……既查了官方說明,也根據關鍵字搜了網上結果,沒找到一個合理的解釋。又嘗試了一下下面的Description參數,同樣沒有效果。於是,推測,System.ComponentModel.DataAnnotations命名空間下的除了Name以外的這幾個參數,僅在WinForm下有效,而在ASP.NET MVC下,無效……望有知情人士告知我的推測是否正確或者真正的原因是什麼或者我的用法哪裡有誤,多謝:)

 

相關文章

聯繫我們

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