我已经在这里查看了几页,例如:
随着几个小时的搜索谷歌。
似乎没有任何地方可以回答我的问题,我相信在 MVC 中应该可以以某种方式解决问题,因此我现在在这里提出这个问题。
所以我面临的问题是我想允许用户通过从下拉菜单中选择一种新语言来更改页面的语言,该菜单位于其自己的部分视图中,因此问题是,我需要重定向到父操作而不是孩子。只要我将用户发送回站点的根目录,这一切都可以正常工作。使用以下代码:
[HttpPost]
public ActionResult RegionSelect(RegionSelectionModel model)
{
var currentUser = Session.GetCurrentUser();
var currentDbUser = Session.GetUserEntity(_dataAccessLayer);
if (!ModelState.IsValid)
{
model.AvailableRegions = CacheHelpers.GetAvailableRegions<RegionView>(_dataAccessLayer, _cache).ToList();
return PartialView("_RegionSelect", model);
}
var selectedRegion = UsersControllerHelpers.SetSelectedRegion(model, _dataAccessLayer, _cache, _website.Client);
var uri = model.OriginalUrl;
var routeInfo = new RouteHelpers(uri, HttpContext.Request.ApplicationPath);
// Route Data
var routeData = routeInfo.RouteData;
routeData.Values.Remove("language");
var defaultClientLanguageCode = _website.Client.LanguagesSupported.FirstOrDefault().Code;
if (currentDbUser.Language.CountryCode != selectedRegion.PrimaryLanguage.CountryCode)
{
//TODO: Decide where to redirect or whether to refresh the whole page...
if ((defaultClientLanguageCode == selectedRegion.PrimaryLanguage.CountryCode) || (model.SelectedRegionId == 0))
{
UsersControllerHelpers.UpdateUsersRegions(currentUser, selectedRegion, _website.Client, _cache, _dataAccessLayer,
Session);
return RedirectToRoute(routeData.Values);
}
routeData.Values.Add("language",selectedRegion.PrimaryLanguage.CountryCode);
return RedirectToRoute(routeData.Values);
}
return RedirectToRoute(routeData.Values);
}
我的两个返回语句返回到根页面,一个返回到根,但是使用一种语言,所以它会是“ http://mysite/en-En/ ”但是如果用户在根站点以外的页面上怎么办? 我想以某种方式将它们重定向回相同的操作,但在开始时使用正确的语言字符串。
我怎样才能做到这一点?
我已经想到了几种“hacky”方法,例如拆分 URL 和交换语言代码。但理想情况下,我希望尽可能干净地做到这一点。
谁能给我任何想法?还是只是不可能?
看起来它应该很简单,但显然不是。
提前感谢您提供的任何帮助。
已编辑
添加了使用下面建议答案中的代码的新代码。
我现在有两个新问题。
我收到此错误消息,如果 URL 中有任何内容,例如 ?page=1:从客户端检测到潜在危险的 Request.Path 值 (?)
如果我尝试使用 .Remove() 完全删除语言。它可以很好地删除它,但是当我尝试使用默认语言重定向到页面时,它会将 language?=language 添加到 URI 的末尾。
有什么想法可以解决这两个问题吗?