asp.net MVC 提供了模型驗證的快捷方式,我在上一篇博客中有專門提到模型驗證的類型以及如何自定義驗證,這次我們來探討一下模型驗證信息如何本地化,活着直白點說如何在不同語言中顯示不同的錯誤信息。
咱們先來說一下,不采用資源文件,我們如何處理錯誤信息的。
首先我們定義UserModel 領域模型類
1 public class UserModel 2 { 3 [Required(ErrorMessage="用戶名不能為空")] 4 public string UserName { get; set; } 5 6 [Required(ErrorMessage="密碼不能為空")] 7 [DataType(DataType.Password)] 8 public string Password { get; set; } 9 }
領域模型類很簡單,就是定義了兩個屬性,用戶名和密碼,然后驗證他們是必填項。
我們在View層,采用簡單的方式來顯示這個領域模型,因為不涉及到具體的邏輯,所以我們一切從簡。
1 @{ 2 Layout = "~/views/shared/_layout.cshtml"; 3 } 4 @model MvcWeb.Models.UserModel 5 <!DOCTYPE html> 6 <html> 7 <head> 8 <title>Index</title> 9 <script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script> 10 <script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 11 <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> 12 </head> 13 <body> 14 @using (Html.BeginForm()) 15 { 16 @Html.EditorForModel() 17 <input type="submit" value="提交" /> 18 } 19 </body> 20 </html>
這些是初學者都很熟悉的一些操作,當然我們今天的重點不是這個,是通過資源文件來動態的顯示不同區域的錯誤信息。下面我們來看一下錯誤信息顯示。
從上面的錯誤信息顯示中,我們可以看出,錯誤信息是可以正確顯示,但是也有一些問題,比如說錯誤信息是硬編碼的,不能動態的更改,也不能適應不同區域顯示。下面我們通過資源文件來更改錯誤信息的顯示,雖然說這個功能點如果知道了會很簡單,但是確實如果自己摸索的話,還真是要費一點功夫的,我也是看了好幾個小時也才慢慢熟悉。
下面我們來新建一個資源文件,首先我們添加一個目錄 叫做Resources,在里面添加一個資源文件,Resource1.resx,請注意:我們不能添加了resource.en-us.resx 和resource.zh-cn.resx 兩個資源文件,而沒有resource.resx文件,這樣的話 在代碼中是看不到resource這個資源類的,所以請注意一下。添加了resource1.resx 和resource1.en-us.resx 兩個資源文件,並且添加一個Name key 和用戶名不能為空以及User Name required,這兩個值是在兩個文件中的。
現在我們在Model中更改錯誤信息的顯示。
1 public class UserModel 2 { 3 [Required(ErrorMessageResourceName = "Name", ErrorMessageResourceType = typeof(Resources.Resource1))] 4 public string UserName { get; set; } 5 6 [Required(ErrorMessage = "密碼不能為空")] 7 [DataType(DataType.Password)] 8 public string Password { get; set; } 9 }
請注意ErrorMessageResourceName 表示的是資源文件中的key,而后面的type就是表示的資源類。
前台代碼不變,我們調試一下,查看結果。
這是在中文環境中的顯示結果,我們可以通過瀏覽器的語言選項,來更改默認的區域,但是可能我的ie版本是10.0,更改了語言選項,沒有看到更改為英文,所以我直接在前台更改線程的區域。
1 @{ 2 Layout = "~/views/shared/_layout.cshtml"; 3 } 4 @model MvcWeb.Models.UserModel 5 <!DOCTYPE html> 6 <html> 7 <head> 8 <title>Index</title> 9 <script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script> 10 <script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 11 <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> 12 </head> 13 <body> 14 @{ 15 Html.EnableClientValidation(); 16 System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture("en-US"); 17 18 System.Threading.Thread.CurrentThread.CurrentUICulture = System.Globalization.CultureInfo.CreateSpecificCulture("en-us"); 19 } 20 @using (Html.BeginForm()) 21 { 22 @Html.EditorForModel() 23 <input type="submit" value="提交" /> 24 } 25 </body> 26 </html>
注意我更改了線程的Culture,現在我們再來查看一下效果。有圖有真相
語言顯示了英文。這個功能點本身沒有什么特別的,我在這里提出來只是為了說明在MVC中如何使用資源文件實現多語言。這是過年前的博客,肯定不是最后一篇,最近公司要用到wcf,以前都是用web 服務,現在用wcf,一切都是初學者,幸好我功底深厚,學習起來還算比較順利。有機會和大家分享一下咱學習wcf的過程。