您的位置:首页 > 编程语言 > ASP

在ASP.NET MVC中通过URL路由实现对多语言的支持

2012-05-04 23:24 721 查看
[code] public class HomeController : Controller

{

public ActionResult Index()

{

return View(new LoginInfo());

}

}


public class LoginInfo

{

 [Display(Name ="UserName", ResourceType = typeof(Resources))]

 public string UserName{ get; set;}


 [Display(Name="Password", ResourceType = typeof(Resources))]

 [DataType(DataType.Password)]

 public string Password{ get; set;}

}

[/code]
[/code]
如下所示的Action方法Index对应的View的定义,这是一个基于LogInfo的强类型View。

[code]
[code] @model MvcApp.Models.LoginInfo

@using (Html.BeginForm())

{ 

 @Html.EditorForModel()

 <input type="submit" value="@MvcApp.Properties.Resources.Login" />

 <input type="button" value="@MvcApp.Properties.Resources.Cancel" />

}

[/code]
[/code]
在Global.asax中,我们修改了默认添加的URL路由注册代码,使请求URL中包含相应的语言文化信息({culture})。

[code]
[code] public class MvcApplication : System.Web.HttpApplication

{

 //其他成员

 public static void RegisterRoutes(RouteCollection routes)

{

//其他操作

 routes.MapRoute(

 name: "Default",

 url: "{culture}/{controller}/{action}/{id}",

 defaults: new{ culture="en", controller = "Home", action = "Index", id = UrlParameter.Optional}

 );

}

}

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





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

[code]
[code] public class CultureAwareHttpModule : IHttpModule

{

 private CultureInfo currentCulture;

 private CultureInfo currentUICulture;


 public void Dispose(){}

 public void Init(HttpApplication context)

{

 context.BeginRequest += SetCurrentCulture;

 context.EndRequest += RecoverCulture;

}

 privatevoid 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);

 object culture;

 if (routeData.Values.TryGetValue("culture", 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;

}

}

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

[code]
[code] <configuration>

 <system.web>

 <httpModules>

 <add name="CultureAwareHttpModule" type="MvcApp.CultureAwareHttpModule, MvcApp"/>

 </httpModules>

 ...

</configuration>

[/code]
[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: