对于一个需要支持多语言的Web应用,一个很常见的使用方式就是通过请求地址来控制界面呈现所基于的语言文化,比如我们在表示请求地址的URL中将上语言文化代码(比如en或者en-US)来指导服务器应该采用怎样的语言来显示界面的内容。对于一个ASP.NET MVC应用来说,我们很容易通过URL路由来实现这样一个功能。[本文已经同步到《How ASP.NET MVC Works?》中]

在具体介绍实现之前,我们通过一个简单的例子谈谈最终实现的效果。在通过ASP.NET MVC项目模板创建的空Web应用中,我们创建了如下一个HomeController,默认的Action方法Index用于呈现一个登录View。作为Model的LoginInfo类包含UserName和Password两个属性,分别表示登录输入的用户名和密码。需要注意的是,在两个属性上应用了DisplayAttribute并通过资源的方式指定了显示名称以实现对多语言的支持。[原代码从这里下载]

   1: 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对应的View的定义,这是一个基于LogInfo的强类型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中,我们修改了默认添加的URL路由注册代码,使请求URL中包含相应的语言文化信息({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: }

我们直接运行该程序,并在请求地址中指定不同的Culture(en和zh),界面呈现基于的语言正是我们期望的。

实际上针对URL路由的本地化可以通过具有如下定义的名为CultureAwareHttpModule的自定义HttpModule来实现。我们通过CultureAwareHttpModule注册了HttpApplication的BeginRequest和EndRequest事件,通过URL路由系统得到表示语言文化的路由变量culture,并对当前线程的Culture和UICulture进行了相应的设置和恢复。

   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: }

我们只需要通过如下配置对CultureAwareHttpModule进行注册即可。

   1: <configuration>
   2:   <system.web>
   3:     <httpModules>
   4:       <add name="CultureAwareHttpModule" type="MvcApp.CultureAwareHttpModule, MvcApp"/>
   5:     </httpModules>
   6:     ...
   7: </configuration>

原文地址:http://www.cnblogs.com/artech/archive/2012/05/04/localization-via-url-routing.html

转:在ASP.NET MVC中通过URL路由实现对多语言的支持的更多相关文章

  1. 白话ASP.NET MVC之一:Url 路由

    好久没有写关于ASP.NET MVC的东西了,虽然<ASP.NET MVC4框架揭秘>已经完完整整的看完一遍,但是感觉和一锅粥差不多,没什么可写的,因为我自己不理解,也就写不出来.现在开始 ...

  2. ASP.NET MVC中获取URL地址参数的两种写法

    一.url地址传参的第一种写法 1.通过mvc中默认的url地址书写格式:控制器/方法名/参数 2.实例:http://localhost:39270/RequestDemo/Index/88,默认参 ...

  3. MVC中的URL路由(一)

    URL路由系统通过对请求地址进行解析从而得到以目标Controller名称为核心的路由数据.Url路由系统最初是为了实现请求url与物理文件路径分离而建立的,MVC的Url Route是将Url地址与 ...

  4. asp.net mvc 中通过url字符串获取controller和action

    在项目中遇到需要通过url字符串获取controller和action的情况,百度了 一下找到了一个可以用的方法 ,在这里分享和记录一下 这个方法是在博客园的博问里看到的 原文地址是http://q. ...

  5. Asp.Net MVC中捕捉错误路由并设置默认Not Found页面。

    在Global中写一个Application_Error捕捉错误路由并重定向到Not Found页面.这里是全局性抓取错误路由,此处还可以写由错误路由导致访问失败的日志记录. protected vo ...

  6. asp.net mvc 中 一种简单的 URL 重写

    asp.net mvc 中 一种简单的 URL 重写 Intro 在项目中想增加一个公告的功能,但是又不想直接用默认带的那种路由,感觉好low逼,想弄成那种伪静态化的路由 (别问我为什么不直接静态化, ...

  7. 在ASP.NET MVC中实现基于URL的权限控制

    本示例演示了在ASP.NET MVC中进行基于URL的权限控制,由于是基于URL进行控制的,所以只能精确到页.这种权限控制的优点是可以在已有的项目上改动极少的代码来增加权限控制功能,和项目本身的耦合度 ...

  8. 在ASP.NET MVC中使用IIS级别的URL Rewrite

    原文 在ASP.NET MVC中使用IIS级别的URL Rewrite 大约一年半前,我在博客上写过一系列关于URL Rewrite的文章(2.3.4),把ASP.NET平台上进行URL Rewrit ...

  9. 在ASP.NET MVC 中获取当前URL、controller、action 、参数

    URL的获取很简单,ASP.NET通用:[1]获取 完整url (协议名+域名+虚拟目录名+文件名+参数) string url=Request.Url.ToString(); [2]获取 虚拟目录名 ...

随机推荐

  1. mongo学习使用记录1

    1 mongo的安装 1.添加MongoDB安装源 1.添加MongoDB安装源vim /etc/yum.repos.d/mongodb-enterprise.repo 将下列配置项写入文件 [mon ...

  2. 微信小程序开发语言的选择

    微信使用的开发语言和文件很「特殊」. 小程序所使用的程序文件类型大致分为以下几种: ①WXML(WeiXin Mark Language,微信标记语言) ②WXSS(WeiXin Style Shee ...

  3. Python高级特性:迭代器和生成器 -转

    在Python中,很多对象都是可以通过for语句来直接遍历的,例如list.string.dict等等,这些对象都可以被称为可迭代对象.至于说哪些对象是可以被迭代访问的,就要了解一下迭代器相关的知识了 ...

  4. java设计模式-菜鸟网络

    http://www.runoob.com/design-pattern/singleton-pattern.html

  5. Spring事务传播属性介绍(二).mandatory、not_supported、never、supports

    Required.Required_New传播属性分析传送门:https://www.cnblogs.com/lvbinbin2yujie/p/10259897.html Nested传播属性分析传送 ...

  6. 【LeetCode题解】24_两两交换链表中的节点(Swap-Nodes-in-Pairs)

    目录 描述 解法一:迭代 思路 Java 实现 Python 实现 复杂度分析 解法二:递归(不满足空间复杂度要求) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解 ...

  7. c# 读取机器CPU信息,硬盘信息,网卡信息

    Windows 管理规范 (WMI) 是可伸缩的系统管理结构,它采用一个统一的.基于标准的.可扩展的面向对象接口.WMI 为您提供与系统管理信息和基础 WMI API 交互的标准方法.WMI 主要由系 ...

  8. SQL Server T—SQL 表连接

    一  笛卡尔积 select  *  from  表1,表2 将两表的记录遍历显示 二表的横向连接 1   使用外键关系作为条件 select  *  from   表1,表2  where   表1 ...

  9. HDU2732(KB11-K 最大流)

    Leapin' Lizards Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  10. HDU2157(SummerTrainingDay05-F dp)

    How many ways?? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...