最近项目需要多语言环境了.

由于项目页面较多,逐个Action去读取资源文件不大现实.就想到了使用 IHttpModule配合MVC的路由规则来实现.

首先创建以个mvc4的应用程序,
添加资源文件夹(自定义)Lang ,
然后在此文件夹下添加Home.Index.resx文件, 
资源的访问修饰符用public
再添加Home.Index.en-us.resx文件
添加个字符串TEST 
再添加Home.Index.zh-cn.resx文件
 添加个字符串TEST 

 

在home/index的视图中添加如下代码:
@MVC4多语言IHttpModule实现.Lang命名空间

Home_Index生成的类名

TEST要国际化的字段

注意: 只有Home.Index.resx会生成一个叫Home_Index的类,其他无类

然后添加以个实现了IHttpModule的类,暂且命名为MyModule
此类需要实现2个方法
 public void Dispose() { } 即可
 public void Init(HttpApplication context)方法

 

MyModule类的具体实现:

 
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Threading;
using System.Web;
using System.Web.Routing; namespace MVC4多语言IHttpModule实现.Lang
{
public class MyModule:IHttpModule
{
private CultureInfo currentCulture;
private CultureInfo currentUICulture; public void Dispose() { }
public void Init(HttpApplication context)
{
context.BeginRequest += SetCurrentCulture;
context.EndRequest += RecoverCulture;
}
private void SetCurrentCulture(object sender, EventArgs args)
{
currentCulture = Thread.CurrentThread.CurrentCulture;
currentUICulture = Thread.CurrentThread.CurrentUICulture;
HttpContextBase contextWrapper = new HttpContextWrapper(HttpContext.Current);
RouteData routeData = RouteTable.Routes.GetRouteData(contextWrapper);
if (routeData == null)
{
return;
}
object culture;
if (routeData.Values.TryGetValue("lang", out culture))
{
try
{
Thread.CurrentThread.CurrentCulture = new CultureInfo(culture.ToString());
Thread.CurrentThread.CurrentUICulture = new CultureInfo(culture.ToString());
}
catch
{ }
}
}
private void RecoverCulture(object sender, EventArgs args)
{
Thread.CurrentThread.CurrentCulture = currentCulture;
Thread.CurrentThread.CurrentUICulture = currentUICulture;
}
}
}
 

然后添加路由 规则:

 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing; namespace MVC4多语言IHttpModule实现
{
// 注意: 如需啟用 IIS6 或 IIS7 傳統模式的說明,
// 請造訪 http://go.microsoft.com/?LinkId=9394801 public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);//在此方法中添加路由规则
BundleConfig.RegisterBundles(BundleTable.Bundles);
AuthConfig.RegisterAuth();
}
}
}
 
  RouteConfig.RegisterRoutes(RouteTable.Routes);//在此方法中添加路由规则

 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing; namespace MVC4多语言IHttpModule实现
{
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Globalization", // 路由名称
"{lang}/{controller}/{action}/{id}", // 带有参数的 URL
new { lang = "zh", controller = "Home", action = "Index", id = UrlParameter.Optional }, // 参数默认值
new { lang = "^[a-zA-Z]{2}(-[a-zA-Z]{2})?$" } //参数约束
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
}
 

然后在配置文件中声明:
在web.config下的system.web下

<configuration>
    <system.web>
        <httpModules> 
            <add name="MyModule" type="MyModule"/> 
        </httpModules> 
    </system.web>
</configuration>
事践显示这种声明注册方法在IIS7.0下,即win7下是不work的。
必须按如下声明:
<configuration> 
    <system.webServer> 
        <modules> 
            <add name="MyModule" type="MyModule"/> 
        </modules>   
    </system.webServer>
</configuration>
参考 : http://msdn.microsoft.com/zh-cn/library/ms227673

完成后具体请参照下图:

 
 
 
运行后如图:

示例下载地址:百度网盘  http://pan.baidu.com/s/1dDtNheT


MVC4多语言IHttpModule实现的更多相关文章

  1. asp.net mvc4 登录界面

    说明:开发环境 asp.net mvc4 c#语言 1.项目目录结构 2.Login控制器中 public ActionResult Index() { return View(); } 对应Inde ...

  2. jquery 访问后台方法 并且获取后方法返回的数据

    说明: 1.开发环境 asp.net MVC4 c#语言. 后台方法位于控制器中ProController.cs中 后台方法如下: public string GetNumber() { string ...

  3. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(30)-本地化(多语言)

    原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(30)-本地化(多语言) 我们的系统有时要扩展到其他国家,或者地区,需要更多的语言环境,微软提供了一些解决 ...

  4. 在mvc4中多语言建站的实例

    环境:vs2012 asp.net mvc4. 实现方式:resource 资源文件,根据路由规则中Lang参数来判断载入哪种语言方式 在网上找到了相关资料,顺便自己做了个练习,新建工程之类的步骤就免 ...

  5. ASP.NET MVC5+EF6+EasyUI 后台管理系统(30)-本地化(多语言)

    系列目录 我们的系统有时要扩展到其他国家,或者地区,需要更多的语言环境,微软提供了一些解决方案,原始我们是用js来控制的,现在不需要了. 我们只要创建简单的资源文件,通过MVC的路由设置就可以轻松的进 ...

  6. ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统

    构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(30)-本地化(多语言)   我们的系统有时要扩展到其他国家,或者地区,需要更多的语言环境,微软提供了一些解决方 ...

  7. ASP.NET MVC 多语言解决方案

    1:打开VS,新建ASP.NET MVC4项目 2:创建一个放本地化资源的文件夹并命名为"Language",右键选择添加新项,选择资源文件并命名为"Com" ...

  8. [入门级] 基于 visual studio 2010 mvc4 的图书管理系统开发初步 (二)

    [入门级] 基于 visual studio 2010 mvc4 的图书管理系统开发初步 (二) Date  周六 10 一月 2015 By 钟谢伟 Category website develop ...

  9. [译]MVC网站教程(四):MVC4网站中集成jqGrid表格插件(系列完结)

    目录 1.   介绍 2.   软件环境 3.   在运行示例代码之前(源代码 + 示例登陆帐号) 4.         jqGrid和AJAX 5.         GridSettings 6.  ...

随机推荐

  1. Ehcache(2.9.x) - API Developer Guide, Cache Exception Handlers

    About Exception Handlers By default, most cache operations will propagate a runtime CacheException o ...

  2. 当页面中(比如弹出框SelectPage)没有textbox等控件如何按Esc关闭

    1.在网页上添加一个空白的ASPxTextBox控件 <dxe:ASPxTextBox ID="txt_Name" Width="1" runat=&qu ...

  3. android NDK 开发步骤

    NDK开发一般分为一下几个步骤:(默认你已经安装好了NDK和android开发环境) 1.创建一个项目 2.创建JNI目录 3.编写nativejava层方法 4.生成JNI头文件 (1)编写java ...

  4. Jquery 获得服务器控件值的方法小结(转)

    由于ASP.NET网页运行后,服务器控件会随机生成客户端id,jquery获取时候不太好操作,google了下,总结有以下3种方法. <!--服务器控件代码:--> <asp:Tex ...

  5. 第四十四篇、iOS开发中git添加.gitignore文件

    .gitignore文件可以直接使用https://github.com/github/gitignore 1.在项目中设置忽略文件(1)将从github上荡下来的对应的.gitignore文件(Sw ...

  6. iMAC——查看开机关机时间

    每次下班都记不好早上几点打的卡,你是不是也经常有这样的情况:  那就用以下的代码考到Mac电脑的终端中,回车: mac终端输入上面命令行 查看开机时间: last | grep reboot 查看关机 ...

  7. OC10_数组的内存管理

    // // main.m // OC10_数组的内存管理 // // Created by zhangxueming on 15/6/18. // Copyright (c) 2015年 zhangx ...

  8. PDF编辑、删除、替换某页面或文字

    在工作中,我们常常会用到PDF,当然尤其是会计,我虽然是程序员,但是“小老鼠”是会计,前几天,突然问我,怎么样将PDF中的某个页面替换掉,也就是删掉某页然后再从另外一个地方找一页补上来: 还需要改变这 ...

  9. 给LinkLabel文本绘制颜色

    我在form中有一个linkLabel,显示文字是“中秋快乐”.现在我希望其中的“中秋”两个字用红色字体显示,“快乐”用黑色字体.请问如何在一个linkLabel中实现上述效果? 答案: privat ...

  10. DTCMS自定义标签,获取所有栏目以及获得二级子栏目导航

    取得二级栏目 DTcms.Web.UI\Label\category.cs中 get_category_child_list 返回当前所有子栏目 DTcms.Web.UI\Label\category ...