0

我已经在这里查看了几页,例如:

如何重定向到 ASP.NET MVC 中的上一个操作?

如何将我的操作重定向到网站的根目录?

随着几个小时的搜索谷歌。

似乎没有任何地方可以回答我的问题,我相信在 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 和交换语言代码。但理想情况下,我希望尽可能干净地做到这一点。

谁能给我任何想法?还是只是不可能?

看起来它应该很简单,但显然不是。

提前感谢您提供的任何帮助。

已编辑

添加了使用下面建议答案中的代码的新代码。

我现在有两个新问题。

  1. 我收到此错误消息,如果 URL 中有任何内容,例如 ?page=1:从客户端检测到潜在危险的 Request.Path 值 (?)

  2. 如果我尝试使用 .Remove() 完全删除语言。它可以很好地删除它,但是当我尝试使用默认语言重定向到页面时,它会将 language?=language 添加到 URI 的末尾。

有什么想法可以解决这两个问题吗?

4

1 回答 1

0

这个选项绝对是我的答案。如果您需要我删除一些代码,请给我留言,我可以这样做,但是链接网站上的示例应该可以帮助您入门。

使用此方法将 Request.UrlReferrer 更改为 Route 数据,然后将您的语言合并到其中,然后使用修改后的 Route 数据执行 RedirectToRoute。

只需使用 RouteData.Values.Add、RouteData.Values.Remove 和 RouteData.values["whatever"],然后将修改后的 RouteData.Values 对象传递给 RedirectToRoute()

于 2012-08-02T15:43:01.733 回答