我搜索了here和其他网页,但我没有找到问题的答案。
我尝试实现的目标是,如果用户在国家/地区A
和国家/地区B
之间切换,语言会切换但不会将其返回主页,而是将其重定向到同一页面他们在(使用更新的语言)。但是,对我来说棘手的部分是,如果用户在国家/地区A
和国家C
或D
或其他任何内容之间切换,我们做想要返回它们到主页。因此,仅如果他们在A
和B
之间切换,我做想要重定向到同一页面。 (我的语言切换工作正常,我只是在不同情况下遇到重定向问题。)
我的方法如下:
[HttpGet]
public ActionResult SetLanguage(string languageId)
{
var currentCulture = GetCurrentCulture(); //Gets the current language for a user
if ((currentCulture == "A" || currentCulture == "B")
&& (languageId == "A" || language == "B"))
{
// Set culture to use chosen language/culture
CultureService.SaveCulture(HttpContext.Response, languageId);
Response.Redirect(Request.RawUrl);
}
else
{
CultureModule.SavePreferredCulture(HttpContext.Response, languageCode);
}
return RedirectToAction("Index", "Home", new { culture = languageId });
}
这导致Chrome中出现此错误:
此网页有重定向循环
在调试时出现我的自我无限循环,但我不明白为什么/如何或如何解决这个问题。
以下是我尝试更改的内容:Response.Redirect(Request.RawUrl);
尝试和return
,但这不起作用,所以我尝试使用其他Redirect
RedirectPermanent
等选项。我没有任何运气,而且已经有一段时间了,因为我不得不玩这样的事情,所以我不知道我在这里做了些什么&#39我做错了。
我相信我需要一个return
代替Response.Redirect(Request.RawUrl);
,但我已经尝试过使用上面的内容了,而且我无法完成任何事情。< / p>
如果您需要任何其他代码或其他详细信息,请告知我们,我会更新帖子。
感谢您的帮助!
答案 0 :(得分:0)
此错误(浏览器出现客户端错误)意味着您将无限重定向到同一页面。
我认为您要检查重定向到同一页面的是:
if((currentCulture == "A" && languageId == "B") || (currentCulture == "B" && languageId == "A"))
您可以尝试使用Request.Url.AbsolutePath来避免在重定向期间再次传递查询字符串。 Request.RawUrl包含查询字符串,并且可能在其中传递languageId。
答案 1 :(得分:0)
不要理会这种方法。编辑路线配置并将语言添加到路线中。使控制器继承自新的基本控制器。覆盖基础控制器中的on begin execute。在那里读取您的路线值并设置文化。
答案 2 :(得分:0)
我最后通过在URL上做一些诡计来解决这个问题。
TLDR:我使用Request.UrlReferrer.Authority
抓取了网址,并使用string.Replace("A","B")
替换了网址中的语言代码。
如果正常网址是这样的:
我希望实现重定向到同一页面但不是EN
我想要FR
或用户设置的任何语言。
所以新网址需要如下所示:
为此,我做到了这一点:
if ((currentCulture == "A" || currentCulture == "B") && (languageId == "A" || language == "B"))
{
var urlReferrer = this.Request.UrlReferrer;
if (urlReferrer != null)
{
var currentUrl = urlReferrer.PathAndQuery;
var url = "https://" + Request.UrlReferrer.Authority;
if ((currentCultureUI == A) && (languageCode == B))
{
var aToBPathAndQuery = currentUrl.Replace("A", "B");
return Redirect(url + aToBPathAndQuery);
}
var bToAPathAndQuery = usersCurrentUrl.Replace("B", "A");
return Redirect(url + bToAPathAndQuery);
}
A
和B
都是资源文件中包含的字符串,因此我将其更改为在问题和答案中节省空间并使事情变得更简单。现在,如果这些值发生了变化,它们可以在资源文件中更改一次,并且它们很适合。可以将它们换成A = "English"
和B = "Spanish"