【问题标题】:default modelbinder uses wrong cultureinfo默认模型绑定器使用错误的cultureinfo
【发布时间】:2012-10-25 08:43:04
【问题描述】:

我有多语言网站,每种语言都使用自己的文化信息。 我尝试使用 ActionFilterAttribute 设置 culterinfo,但它在模型绑定后被触发。 我也尝试了全局 asax BeginRequest,但 RouteData 尚不可用。

那么应该在哪里将 CurrentUICulture 设置为 modelbinder 也会使用所需的cultureinfo?

最大

【问题讨论】:

    标签: c# asp.net-mvc model-binding cultureinfo


    【解决方案1】:

    您可以从这篇精彩的文章中找到可以/需要覆盖的内容:An Introduction to ASP.NET MVC Extensibility

    你可以编写一个自定义的 MvcRouteHandler:

    public class LangRouteHandler : MvcRouteHandler
    {
        protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
        {
            if (requestContext.RouteData.Values.ContainsKey("lang"))
            {
                var culture = new CultureInfo(requestContext.RouteData.Values["lang"].ToString());
                if (culture != null)
                {
                    Thread.CurrentThread.CurrentUICulture = culture;
                    Thread.CurrentThread.CurrentCulture = culture;
                }
            }
    
            return base.GetHttpHandler(requestContext);
        }
    }
    

    并像这样在你的路由中使用这个路由处理程序:

    routes.MapRoute(
       name: "Default",
       url: "{controller}/{lang}/{action}/{id}",
       defaults: new { controller = "Home", lang = "en", action = "Index", id = UrlParameter.Optional }
    ).RouteHandler = new LangRouteHandler();
    

    【讨论】:

    • 一个问题...是否可以将我的自定义路由处理程序设为默认路由处理程序?
    • 不这么认为。但是如果你想确定看看MVC项目中MapRoute扩展方法的源代码,它是开源的。
    猜你喜欢
    • 1970-01-01
    • 2018-08-22
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 2022-09-23
    • 2013-03-26
    相关资源
    最近更新 更多