对于一个需要支持多语言的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. psql工具使用(二)

    所有psql命令都以   \   开头 一.使用psql -l查看有哪些数据库: -bash-4.2$ psql -l List of databases Name | Owner | Encodin ...

  2. 面试题-----按位翻转32位unsigned

    // test.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include < ...

  3. mysql数据库中实现内连接、左连接、右连接

    原文:http://www.cnblogs.com/xwdreamer/archive/2010/12/15/2297058.html 内连接:把两个表中数据对应的数据查出来 外连接:以某个表为基础把 ...

  4. 基于C++ Qt实现的红色警戒3修改器

    前言 这部修改器制作有一段时间了,但是一直没出教程.今天利用周末空闲写篇教程,给后来者指路的同时也加深自己对游戏修改器的理解,大佬就随便看看吧 浏览了一下网络,形形色色的单机游戏修改器教程,但是基本只 ...

  5. Docker配置阿里云加速地址

    首先需要注册一个阿里云账号,只要注册账号就可以,不用充钱购买任何阿里云服务! 打开阿里云网站https://cr.console.aliyun.com,登陆自己的阿里云账号. 然后只需要在服务器配置d ...

  6. Jquery 基本动画

    1.三组基本的动画 显示:show .隐藏hide.滑入:slideUp.滑出:slideDown.滑入滑出切换:slideTpggle.淡入:fadeIn.淡出:fadeOut.淡入淡出切换:fad ...

  7. 第20课-数据库开发及ado.net 可空值类型,资料管理器,多条件查询,Case

    第20课-数据库开发及ado.net 可空值类型,资料管理器,多条件查询,Case SqlHelper using System; using System.Collections.Generic; ...

  8. 诡异的楼梯(bfs)hdu1180

    诡异的楼梯 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Submiss ...

  9. 快速导出云服务器mysql的表数据

    1.许多互联网应用的数据库都布署在远程的Linux云服务器上,我们经常要编辑表数据,导出表数据. 通常的做法是ssh连接到服务器,然后命令登录,命令查询导出数据,费时费力,效率低下. 安装TreeSo ...

  10. .net防止SQL注入的一种方式

    首先也要明白一点,什么是SQL注入 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具体来说,它是利用现有应用程序,将 ...