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);
}