对于一个需要支持多语言的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. 揭开Future的神秘面纱——结果获取

    前言 在前面的两篇博文中,已经介绍利用FutureTask任务的执行流程,以及利用其实现的cancel方法取消任务的情况.本篇就来介绍下,线程任务的结果获取. 系列目录 揭开Future的神秘面纱—— ...

  2. 厌倦了“正在输入…”的客服对话,是时候pick视频客服了

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯云视频发表于云+社区专栏 关注公众号"腾讯云视频",一键获取 技术干货 | 优惠活动 | 视频方案 什么?! ...

  3. [转]csv文件导入Mysql

    本文转自:https://blog.csdn.net/quiet_girl/article/details/71436108 本篇博客主要讲将csv文件导入Mysql的方法(使用命令行). Step1 ...

  4. sqlserver C# 数据类型对照表(转载)

    数据库中字段类型对应C#中的数据类型: 数据库                 C#程序 int int32 text string bigint int64  或 longbinary System ...

  5. PHP开发环境安装说明书

    php安装说明书 需要安装包可以拿U盘找技术--小豪拷贝. 一.安装对象和安装顺序 0   vcredist_x64.exe(Microsoft Visual C++ 运行时文件和操作系统组件) 1 ...

  6. 【RabbitMQ】1、RabbitMQ的几种典型使用场景

    RabbitMQ主页:https://www.rabbitmq.com/ AMQP AMQP协议是一个高级抽象层消息通信协议,RabbitMQ是AMQP协议的实现.它主要包括以下组件: 1.Serve ...

  7. JVM调优的总结

    堆大小设置JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制:系统的可用虚拟内存限制:系统的可用物理内存限制.32位系统下,一般限制在1.5G~2G:64为操作 ...

  8. Java - HashMap 多线程安全解析

    HashMap多线程并发问题分析 多线程put后可能导致get死循环 从前我们的Java代码因为一些原因使用了HashMap这个东西,但是当时的程序是单线程的,一切都没有问题.后来,我们的程序性能有问 ...

  9. JSON: jasckson 字段 过滤

    有这样一个场景存在一个model类如果User,这里省略了getter/setter方法 class User { String name; String uuid; Long created; Lo ...

  10. JSON 解析与封装

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.解析: var str = '{"name":"huangxiaojian&qu ...