检查url是否使用语言正确构造

时间:2013-02-03 13:45:54

标签: c# asp.net-mvc

我有一个MVC4应用程序,在路由/网址中有一个额外的元素,它被命名为语言:

routes.MapRoute(
    name: "languageDefault",
    url: "{language}/{controller}/{action}/{id}",
    defaults: new {
        language = "en-US",
        controller = "Home",
        action = "Index",
        id = UrlParameter.Optional
    }
);

现在,每次操作完成后,我都会使用自定义filterAttribute检查语言是否设置正确:

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        string cultureName = null;
        var request = filterContext.HttpContext.Request;
        string currentUrl = request.RawUrl;
        string[] splittedStrings = currentUrl.Split('/');

        string currentLanguage  = CultureHelper.CheckCulture();
        var cultureCookie       = request.Cookies["_culture"];
        var possibleCultures    = UnitOfWork.CulturesRepository.GetListOfCultureNames();

        foreach (string culture in possibleCultures)
        {
            if (splittedStrings[1] == culture) cultureName = splittedStrings[1];
        }
        if (cultureCookie != null) cultureName = cultureCookie.Value;
        if (currentLanguage != null) cultureName = currentLanguage;

        if (cultureName != null)
        {
            Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(cultureName);
            Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
        }
        else
        {
            cultureName = possibleCultures[0];
            Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(cultureName);
            Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
        }

        base.OnActionExecuting(filterContext);
    }

我现在的问题是,当我检查是否存在语言时,如果没有,请设置一个,如果提供的语言不正确,我实际上并没有做任何事情。例如 当用户键入时(请参阅hxxp为http):

hxxp://www.mywebsite.com/en-US/shop

他提供了正确的网址,因此会正确看到商店页面。但是,如果他没有提供这样的语言:

hxxp://www.mywebsite.com/shop

语言检查完成后,根据这是否是他的第一次访问,他的语言已经设定。这个问题是网址不会改变

我希望更改网址,以便显示用户查看网页的语言。换句话说,当试图访问时

 hxxp://www.mywebsite.com/shop

他应该被重定向到:

hxxp://www.mywebsite.com/en-US/shop

无论访问者访问哪个页面,都需要这样做。换句话说,我可能需要在global.asax或我提供的覆盖函数中添加一些东西。 但我不知道是什么以及如何。

请给我一些帮助。

1 个答案:

答案 0 :(得分:0)

我通过更改OnActionExecuting方法解决了这个问题:

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var request         = filterContext.HttpContext.Request;
        string currentUrl   = request.RawUrl;
        var urlHelper       = new UrlHelper(request.RequestContext);

        string baseurl                      = urlHelper.Content("~");
        string currentLanguageFromUrl       = currentUrl.Split('/')[1];
        string currentLanguageFromCulture   = CultureHelper.CheckCulture();
        var currentLanguageFromCookie       = request.Cookies["_culture"];

        var possibleCultures                = UnitOfWork.CulturesRepository.GetListOfCultureNames();

        if (possibleCultures.All(culture => currentLanguageFromUrl != culture))
        {
            string cultureName;
            string newUrl;

            if (currentLanguageFromCookie != null)
            {
                cultureName = currentLanguageFromCookie.Value;
                CultureHelper.SetCulture(cultureName);
                newUrl = baseurl + cultureName;
                filterContext.Result = new RedirectResult(newUrl);
                return;
            }

            if (currentLanguageFromCulture != null)
            {
                cultureName = currentLanguageFromCulture;
                CultureHelper.SetCulture(cultureName);
                newUrl = baseurl + cultureName;
                filterContext.Result = new RedirectResult(newUrl);
                return;
            }

            cultureName = possibleCultures[0];
            CultureHelper.SetCulture(cultureName);
            newUrl = baseurl + cultureName;
            filterContext.Result = new RedirectResult(newUrl);
            return;
        }

        base.OnActionExecuting(filterContext);
    }

现在,当您填写的语言不正确时,您将被重定向到具有正确语言的页面,如果您提供了两个不正确的参数,则会将您重定向到404(这是合乎逻辑的)。