如何重定向到MVC站点中的父操作?

时间:2012-08-02 14:53:02

标签: c# asp.net-mvc asp.net-mvc-3 url-redirection

我一直在看这里的几个页面,例如:

How do I redirect to the previous action in ASP.NET MVC?

How can I redirect my action to the root of the web site?

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

似乎没有找到我的问题的答案,我相信它应该可以在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和交换语言代码。但理想情况下,我希望尽可能保持清洁。

任何人都可以给我任何想法吗?或者这是不可能的?

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

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

EDITED

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

我现在有两个新问题。

  1. 我收到此错误消息,如果网址中有任何内容,例如?page = 1: 从客户端(?)

  2. 检测到潜在危险的Request.Path值
  3. 如果我尝试使用.Remove()完全删除语言。它删除它很好,但是当我尝试使用默认语言重定向到页面时,它会在URI的末尾添加语言?= language。

  4. 我有什么想法可以解决这两个问题?

1 个答案:

答案 0 :(得分:1)

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

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

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