国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 編程設(shè)計(jì) > 正文

ASP.NET MVC實(shí)現(xiàn)功能:通過(guò)URL路由實(shí)現(xiàn)對(duì)多語(yǔ)言的支持

2020-07-14 13:37:43
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
對(duì)于一個(gè)需要支持多語(yǔ)言的Web應(yīng)用,一個(gè)很常見(jiàn)的使用方式就是通過(guò)請(qǐng)求地址來(lái)控制界面呈現(xiàn)所基于的語(yǔ)言文化,比如我們?cè)诒硎菊?qǐng)求地址的URL中將 上語(yǔ)言文化代碼(比如en或者en-US)來(lái)指導(dǎo)服務(wù)器應(yīng)該采用怎樣的語(yǔ)言來(lái)顯示界面的內(nèi)容。對(duì)于一個(gè)ASP.NET MVC應(yīng)用來(lái)說(shuō),我們很容易通過(guò)URL路由來(lái)實(shí)現(xiàn)這樣一個(gè)功能。[本文已經(jīng)同步到《How ASP.NET MVC Works?》中]
在 具體介紹實(shí)現(xiàn)之前,我們通過(guò)一個(gè)簡(jiǎn)單的例子談?wù)勛罱K實(shí)現(xiàn)的效果。在通過(guò)ASP.NET MVC項(xiàng)目模板創(chuàng)建的空Web應(yīng)用中,我們創(chuàng)建了如下一個(gè)HomeController,默認(rèn)的Action方法Index用于呈現(xiàn)一個(gè)登錄View。作 為Model的LoginInfo類包含UserName和Password兩個(gè)屬性,分別表示登錄輸入的用戶名和密碼。需要注意的是,在兩個(gè)屬性上應(yīng)用 了DisplayAttribute并通過(guò)資源的方式指定了顯示名稱以實(shí)現(xiàn)對(duì)多語(yǔ)言的支持。[原代碼從這里下載]
public class HomeController : Controller
2: {
3: public ActionResult Index()
4: {
5: return View(new LoginInfo());
6: }
7: }
8:
9: public class LoginInfo
10: {
11: [Display(Name ="UserName", ResourceType = typeof(Resources))]
12: public string UserName { get; set; }
13:
14: [Display(Name="Password", ResourceType = typeof(Resources))]
15: [DataType(DataType.Password)]
16: public string Password { get; set; }
17: }
如下所示的Action方法Index對(duì)應(yīng)的View的定義,這是一個(gè)基于LogInfo的強(qiáng)類型View。
1: @model MvcApp.Models.LoginInfo
2: @using (Html.BeginForm())
3: {
4: @Html.EditorForModel()
5: <input type="submit" value="@MvcApp.Properties.Resources.Login" />
6: <input type="button" value="@MvcApp.Properties.Resources.Cancel" />
7: }
在Global.asax中,我們修改了默認(rèn)添加的URL路由注冊(cè)代碼,使請(qǐng)求URL中包含相應(yīng)的語(yǔ)言文化信息({culture})。
1: public class MvcApplication : System.Web.HttpApplication
2: {
3: //其他成員
4: public static void RegisterRoutes(RouteCollection routes)
5: {
6: //其他操作
7: routes.MapRoute(
8: name: "Default",
9: url: "{culture}/{controller}/{action}/{id}",
10: defaults: new { culture="en", controller = "Home", action = "Index", id = UrlParameter.Optional }
11: );
12: }
13: }
我們直接運(yùn)行該程序,并在請(qǐng)求地址中指定不同的Culture(en和zh),界面呈現(xiàn)基于的語(yǔ)言正是我們期望的。
實(shí)際上針對(duì)URL路由的本地化可以通過(guò)具有如下定義的名為CultureAwareHttpModule的自定義HttpModule來(lái)實(shí)現(xiàn)。我們 通過(guò)CultureAwareHttpModule注冊(cè)了HttpApplication的BeginRequest和EndRequest事件,通過(guò) URL路由系統(tǒng)得到表示語(yǔ)言文化的路由變量culture,并對(duì)當(dāng)前線程的Culture和UICulture進(jìn)行了相應(yīng)的設(shè)置和恢復(fù)。
1: public class CultureAwareHttpModule : IHttpModule
2: {
3: private CultureInfo currentCulture;
4: private CultureInfo currentUICulture;
5:
6: public void Dispose(){}
7: public void Init(HttpApplication context)
8: {
9: context.BeginRequest += SetCurrentCulture;
10: context.EndRequest += RecoverCulture;
11: }
12: private void SetCurrentCulture(object sender, EventArgs args)
13: {
14: currentCulture = Thread.CurrentThread.CurrentCulture;
15: currentUICulture = Thread.CurrentThread.CurrentUICulture;
16: HttpContextBase contextWrapper = new HttpContextWrapper(HttpContext.Current);
17: RouteData routeData = RouteTable.Routes.GetRouteData(contextWrapper);
18: object culture;
19: if (routeData.Values.TryGetValue("culture", out culture))
20: {
21:
22: try
23: {
24: Thread.CurrentThread.CurrentCulture = new CultureInfo(culture.ToString());
25: Thread.CurrentThread.CurrentUICulture = new CultureInfo(culture.ToString());
26: }
27: catch
28: { }
29: }
30: }
31: private void RecoverCulture(object sender, EventArgs args)
32: {
33: Thread.CurrentThread.CurrentCulture = currentCulture;
34: Thread.CurrentThread.CurrentUICulture = currentUICulture;
35: }
36: }
我們只需要通過(guò)如下配置對(duì)CultureAwareHttpModule進(jìn)行注冊(cè)即可。
1: <configuration>
2: <system.web>
3: <httpModules>
4: <add name="CultureAwareHttpModule" type="MvcApp.CultureAwareHttpModule, MvcApp"/>
5: </httpModules>
6: ...
7: </configuration>
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 靖安县| 玉林市| 仲巴县| 华容县| 曲水县| 平凉市| 武川县| 杂多县| 齐齐哈尔市| 无锡市| 明光市| 建阳市| 睢宁县| 滦平县| 轮台县| 嘉禾县| 太谷县| 邻水| 北票市| 香格里拉县| 普宁市| 安达市| 武功县| 诸城市| 叙永县| 新平| 交城县| 华亭县| 永善县| 宁陕县| 荔波县| 望谟县| 邵东县| 庆安县| 册亨县| 怀柔区| 榆树市| 鸡泽县| 科尔| 望江县| 滕州市|