Question

I have been looking at several pages on here already such as:

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?

Along with several hours of searching google.

No where seems to have an answer to my problem and I am sure it should be possible within MVC somehow hence the reason I am now here to ask the question.

So the problem I am facing is that I want to allow the user to change the language of the page by choosing a new language from a drop down menu which is in its own partial view hence the problem, I need to redirect to the parent action and not the child. This all works fine as long as i send the user back to the root of the site. Using the following code:

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

Two of my return statements return to the root page and one returns to the root but with a language so it would be "http://mysite/en-En/" but what if the user is on a page other than the root site? I want to somehow redirect them back to this same action but with the correct language string at the start.

How can i do this?

I have thought of several "hacky" ways of doing this, such as splitting the URL and swapping the language codes over. But ideally I am looking to do this as clean as possible.

Can anyone give me any idea's? Or is it just not possible?

It seems like it should be really simple but apparently not.

Thanks in advance for any help that you can provide.

EDITED

Added new code that is using code from suggested answer below.

I am now having two new problems.

  1. I am getting this error message, if there are any things in the URL such as ?page=1: A potentially dangerous Request.Path value was detected from the client (?)

  2. If i try and remove the language completely using .Remove(). It removes it fine but when i try and redirect to the page in the default language it adds language?=language to the end of the URI.

Any ideas how i can resolve these two issues?

Was it helpful?

Solution

This option is definitely my answer. Leave me a comment if you need me to drop some code, and I can do that, but the examples on the linked website should get you started.

Use this method to change Request.UrlReferrer into Route data, then merge your language into that, then do a RedirectToRoute with the modified Route data.

Just use RouteData.Values.Add, RouteData.Values.Remove, and RouteData.values["whatever"], then pass that modified RouteData.Values object to RedirectToRoute()

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top