Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET MVC 5-重定向到具有区域性的同一页面_C#_Asp.net_Asp.net Mvc_Asp.net Mvc 5 - Fatal编程技术网

C# ASP.NET MVC 5-重定向到具有区域性的同一页面

C# ASP.NET MVC 5-重定向到具有区域性的同一页面,c#,asp.net,asp.net-mvc,asp.net-mvc-5,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 5,我的项目已经本地化了。我想要的是,每当用户改变文化时,它都会将他重定向到他所在的页面。但是现在有了新的文化 例如,如果用户位于“注册”页面,则会出现以下链接: http://localhost:49445/pt/Account/Register pt是一种文化 我开始环顾四周,想出了这种改变文化的方法: public ActionResult ChangeCulture(string lang) { var langCookie = new HttpCookie("lang", lan

我的项目已经本地化了。我想要的是,每当用户改变文化时,它都会将他重定向到他所在的页面。但是现在有了新的文化

例如,如果用户位于“注册”页面,则会出现以下链接:

http://localhost:49445/pt/Account/Register
pt是一种文化

我开始环顾四周,想出了这种改变文化的方法:

public ActionResult ChangeCulture(string lang)
{
    var langCookie = new HttpCookie("lang", lang) { HttpOnly = true };
    Response.AppendCookie(langCookie);
    string url = this.Request.UrlReferrer.AbsoluteUri;

    return Redirect(url);
}
但很明显,这不起作用,因为它只会再次将我重定向到

http://localhost:49445/pt/Account/Register
而不是

http://localhost:49445/en/Account/Register

我一直在四处寻找,什么也没找到。有人能给我指出正确的方向吗?或者提供一个好答案?

当前文化必须是您路线的一部分:

Global.asax

const string defaultCulture = "sk";

routes.MapRoute(
        "DefaultLocalized",
        "{culture}/{controller}/{action}",
        new { controller = "Home", action = "Index", culture = defaultCulture },
        new { culture = "sk|cz" }
);  
为每个请求设置当前区域性:

    protected void Application_BeginRequest()
    {           
        SetCurrentCulture();
    }

    private void SetCurrentCulture()
    {
        var queryItems = Request.RawUrl.Split(new char [] {'/', '?'}, StringSplitOptions.RemoveEmptyEntries);

        var currentCulture = new CultureInfo("sk-SK");

        HashSet<string> suportedLanguages = new HashSet<string>() { "sk", "cz" };

        var currentLang = string.Empty;

        if (queryItems.Length > 0)
            currentLang = queryItems[0].ToLowerInvariant();            

        if (suportedLanguages.Contains(currentLang))
        {
            if (currentLang == "cz")
            {
                currentCulture = new CultureInfo("cs-CZ");
            }                
        }            

        Thread.CurrentThread.CurrentCulture = currentCulture;
        Thread.CurrentThread.CurrentUICulture = currentCulture;
    }

要仅更改1个参数(例如区域性),请使用以下帮助程序:

public static string ActionWithNewCulture(this UrlHelper urlHelper, string culture)
{
    var newRouteData = new RouteValueDictionary(urlHelper.RequestContext.RouteData.Values);
    newRouteData["culture"] = culture;

    return urlHelper.RouteUrl(newRouteData);
}

我将在稍后测试此方法。您知道是否有方法重定向到同一页面并保留验证消息。例如,如果用户试图注册,但显示了一些错误消息。然后您更改了区域性,它将重定向并保留验证消息。@Lokuzt验证消息显示为POST请求的结果。如果更改路由,则会发出新的GET请求,因此验证消息将消失。您必须重新提交表单才能再次显示这些消息。我一直在尝试使用tempdata重新提交表单。但是我没有成功,但我仍然认为这不是正确的方法。你知道我应该采取哪种方法吗?@Lokuzt在用户开始填写注册表之前设置正确的文化并不容易?
public static string ActionWithCurrentQuery(this UrlHelper urlHelper, string actionName, string controllerName, object routeValues)
        {
            var request = urlHelper.RequestContext.HttpContext.Request;
            var url = urlHelper.Action(actionName, controllerName, routeValues, "http");
            var uriBuilder = new UriBuilder(url);
            var query = HttpUtility.ParseQueryString(string.Empty);
            foreach (string key in request.QueryString.Keys)
            {
                query[key] = request[key];
            }
            var routeQuery = HttpUtility.ParseQueryString(uriBuilder.Query);
            foreach (string key in routeQuery)
            {
                query[key] = routeQuery[key];
            }
            uriBuilder.Query = query.ToString();

            return uriBuilder.ToString();
        }
public static string ActionWithNewCulture(this UrlHelper urlHelper, string culture)
{
    var newRouteData = new RouteValueDictionary(urlHelper.RequestContext.RouteData.Values);
    newRouteData["culture"] = culture;

    return urlHelper.RouteUrl(newRouteData);
}