在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]
相关文章推荐
- 在ASP.NET MVC中通过URL路由实现对多语言的支持
- 转:在ASP.NET MVC中通过URL路由实现对多语言的支持
- 在ASP.NET MVC中通过URL路由实现对多语言的支持
- ASP.NET MVC 多语言实现——URL路由
- Asp.Net MVC 多语言实现—— JavaScript多语言支持
- asp.net mvc 通过修改路由规则来实现页面的URL多参数传递
- 自定义ResourceProviderFactory、IResourceProvider实现ASP.NET、ASP.NET MVC多语言支持
- Asp.net MVC 2 网站轻松实现多语言支持
- [翻译]ASP.NET MVC 3 开发的20个秘诀(四)[20 Recipes for Programming MVC 3]:实现多语言支持
- dhl:asp.net mvc下用jQuery通过AJAX 实现HTTP 请求加载远程数据
- 晚上无聊象征性收取了网友100元辛苦费,实现支持多语言功能的XML语言包版的C#的ASP.NET多语言支持例子程序
- asp.net MVC URL路由入门指南
- asp.net mvc 中通过url字符串获取controller和action
- ASP.NET MVC 的URL路由介绍
- BackBone结合ASP.NET MVC实现页面路由操作
- 晚上无聊象征性收取了网友100元辛苦费,实现支持多语言功能的XML语言包版的C#的ASP.NET多语言支持例子程序
- Asp.net MVC防止图片盗链的实现方法,通过自定义RouteHandler来操作
- ASP.NET MVC的Localization本地化多语言支持
- ASP.NET MVC 之URL路由
- Asp.Net MVC2.0 Url 路由入门---实例篇 【转】