首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在ASP.Net MVC应用中设置区域性

在ASP.Net MVC应用中设置区域性
EN

Stack Overflow用户
提问于 2009-10-13 15:00:44
回答 5查看 130.3K关注 0票数 90

在ASP.net MVC应用程序中设置区域性/UI区域性的最佳位置是什么

目前我有一个CultureController类,如下所示:

代码语言:javascript
复制
public class CultureController : Controller
{
    public ActionResult SetSpanishCulture()
    {
        HttpContext.Session["culture"] = "es-ES";
        return RedirectToAction("Index", "Home");
    }

    public ActionResult SetFrenchCulture()
    {
        HttpContext.Session["culture"] = "fr-FR";
        return RedirectToAction("Index", "Home");
    }
}

以及主页上每种语言的超链接,其链接如下:

代码语言:javascript
复制
<li><%= Html.ActionLink("French", "SetFrenchCulture", "Culture")%></li>
<li><%= Html.ActionLink("Spanish", "SetSpanishCulture", "Culture")%></li>

这工作得很好,但我认为有一种更合适的方法来做这件事。

我正在使用下面的ActionFilter http://www.iansuttle.com/blog/post/ASPNET-MVC-Action-Filter-for-Localized-Sites.aspx阅读“文化”。我有点MVC菜鸟,所以我不相信我把它设置在正确的位置。我不想在web.config级别上这样做,它必须基于用户的选择。我也不想检查他们的http-header来从他们的浏览器设置中获取文化。

编辑:

我只是想说清楚--我并不是想决定是否使用会话。我对这一点很满意。我想弄清楚的是,最好是在一个为每个要设置的文化都有一个操作方法的文化控制器中做这件事,还是在MVC管道中有一个更好的地方来做这件事?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-10-13 17:02:24

我使用这个localization method并添加了一个路由参数,每当用户访问example.com/xx-xx/时,该参数设置区域性和语言。

示例:

代码语言:javascript
复制
routes.MapRoute("DefaultLocalized",
            "{language}-{culture}/{controller}/{action}/{id}",
            new
            {
                controller = "Home",
                action = "Index",
                id = "",
                language = "nl",
                culture = "NL"
            });

我有一个过滤器,它执行实际的文化/语言设置:

代码语言:javascript
复制
using System.Globalization;
using System.Threading;
using System.Web.Mvc;

public class InternationalizationAttribute : ActionFilterAttribute {

    public override void OnActionExecuting(ActionExecutingContext filterContext) {

        string language = (string)filterContext.RouteData.Values["language"] ?? "nl";
        string culture = (string)filterContext.RouteData.Values["culture"] ?? "NL";

        Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(string.Format("{0}-{1}", language, culture));
        Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(string.Format("{0}-{1}", language, culture));

    }
}

要激活国际化属性,只需将其添加到您的类中:

代码语言:javascript
复制
[Internationalization]
public class HomeController : Controller {
...

现在,只要访问者访问http://example.com/de-DE/Home/Index,就会显示德语站点。

我希望这个答案给你指明了正确的方向。

我还制作了一个小的MVC5示例项目,您可以在其中找到here

只需转到http://{yourhost}:{port}/en-us/home/index查看英语(美国)的当前日期,或者将其更改为http://{yourhost}:{port}/de-de/home/index以表示德语等。

票数 118
EN

Stack Overflow用户

发布于 2009-10-13 16:44:56

我会在控制器的Initialize事件中这样做...

代码语言:javascript
复制
    protected override void Initialize(System.Web.Routing.RequestContext requestContext)
    {
        base.Initialize(requestContext);

        const string culture = "en-US";
        CultureInfo ci = CultureInfo.GetCultureInfo(culture);

        Thread.CurrentThread.CurrentCulture = ci;
        Thread.CurrentThread.CurrentUICulture = ci;
    }
票数 25
EN

Stack Overflow用户

发布于 2009-10-13 15:05:13

由于它是按用户存储的设置,因此会话是存储信息的合适位置。

我会将控制器更改为接受区域性字符串作为参数,而不是为每个潜在的区域性使用不同的操作方法。向页面添加链接很容易,而且无论何时需要新的区域性,您都不需要重复编写相同的代码。

代码语言:javascript
复制
public class CultureController : Controller    
{
        public ActionResult SetCulture(string culture)
        {
            HttpContext.Session["culture"] = culture
            return RedirectToAction("Index", "Home");
        }        
}

<li><%= Html.ActionLink("French", "SetCulture", new {controller = "Culture", culture = "fr-FR"})%></li>
<li><%= Html.ActionLink("Spanish", "SetCulture", new {controller = "Culture", culture = "es-ES"})%></li>
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1560796

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档