0

私はすでにここで次のようないくつかのページを見てきました:

ASP.NET MVCで前のアクションにリダイレクトするにはどうすればよいですか?

アクションをWebサイトのルートにリダイレクトするにはどうすればよいですか?

グーグルを検索する数時間と一緒に。

私の問題に対する答えはどこにもありません。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);
    }

私のreturnステートメントのうち2つはルートページに戻り、1つはルートに戻りますが、言語は「http:// mysite / en-En /」になりますが、ユーザーがルートサイト以外のページにいる場合はどうなりますか?どういうわけか、最初に正しい言語文字列を使用して、同じアクションにリダイレクトしたいと思います。

これどうやってするの?

URLを分割したり、言語コードを入れ替えたりするなど、これを行うためのいくつかの「ハッキー」な方法を考えました。しかし、理想的には、これを可能な限りクリーンにすることを目指しています。

誰かが私に何かアイデアを教えてもらえますか?それともそれは不可能ですか?

本当にシンプルなはずですが、そうではないようです。

あなたが提供できるどんな助けにも前もって感謝します。

編集済み

以下の提案された回答からのコードを使用している新しいコードを追加しました。

私は今、2つの新しい問題を抱えています。

  1. URLに?page = 1などの何かがある場合、このエラーメッセージが表示されます:潜在的に危険なRequest.Path値がクライアントから検出されました(?)

  2. .Remove()を使用して言語を完全に削除しようとすると、それはうまく削除されますが、デフォルトの言語でページにリダイレクトしようとすると、URIの最後にlanguage?=languageが追加されます。

これらの2つの問題を解決する方法はありますか?

4

1 に答える 1

0

このオプションは間違いなく私の答えです。コードをドロップする必要がある場合はコメントを残してください。それは可能ですが、リンクされたWebサイトの例で開始できます。

このメソッドを使用してRequest.UrlReferrerをルートデータに変更し、言語をそれにマージしてから、変更されたルートデータを使用してRedirectToRouteを実行します。

RouteData.Values.Add、RouteData.Values.Remove、およびRouteData.values ["whatever"]を使用して、変更したRouteData.ValuesオブジェクトをRedirectToRoute()に渡すだけです。

于 2012-08-02T15:43:01.733 に答える