2015-11-10 44 views
0

我搜索了here和其他網頁,但我沒有找到我的問題的答案。這個網頁有一個重定向循環時做Response.Redirect(Request.RawUrl)

我想要實現的是,如果用戶在國家A和國家B之間切換,但語言切換但不是將它們返回到主頁,而是將它們重定向到它們所在的同一頁面(使用更新後的語言) 。然而,對我來說棘手的部分是,如果用戶在國家A和國家CD或其他任何之間切換,我們想要返回到主頁。所以只有如果他們之間切換AB想要重定向到同一頁面。 (我的語言交換的東西是工作的罰款,我只具有在不同場景中的重定向問題。)

我的方法是這樣的:

 [HttpGet] 
     public ActionResult SetLanguage(string languageId) 
     { 

     var currentCulture = GetCurrentCulture(); //Gets the current language for a user 

     if ((currentCulture == "A" || currentCulture == "B") 
      && (languageId == "A" || language == "B")) 
     { 
      // Set culture to use chosen language/culture 
      CultureService.SaveCulture(HttpContext.Response, languageId); 
      Response.Redirect(Request.RawUrl); 
     } 
     else 
     { 
      CultureModule.SavePreferredCulture(HttpContext.Response, languageCode); 
     }   
     return RedirectToAction("Index", "Home", new { culture = languageId }); 
    } 

這導致在Chrome這個錯誤:

此網頁有重定向循環

調試時我看來我讓自己陷入無限循環,但我不明白爲什麼/如何,或者如何解決這個問題。

這是我嘗試過改變:在Response.Redirect(Request.RawUrl);嘗試和return的是,但是,這並不工作,所以我試圖玩弄其他Redirect選項,如RedirectPermanent和其他人。我對此沒有任何運氣,而且我已經有一段時間了,因爲我不得不面對這樣的事情,所以我在這裏對我做錯的事情感到迷茫。

我相信我需要一個return來代替Response.Redirect(Request.RawUrl);,但我試過玩過上面的東西,我無法得到任何東西去。

如果您需要任何其他代碼或其他詳細信息,請讓我知道,我會更新帖子。

謝謝你的幫助!

+0

您的家庭方法是否重定向到SetLanguage?如果是這樣,導致重定向的邏輯是什麼? – Necoras

+0

@Necoras不,該方法只是返回'View();' – maxshuty

+0

當然它有一個無限循環。的Response.Redirect(Request.RawUrl);只是意味着「重新回到這裏」。 – Sentinel

回答

0

我最終通過在URL上做了一些欺騙手段來解決這個問題。

TLDR:我使用Request.UrlReferrer.Authority抓取了URL,並使用string.Replace("A","B")替換了URL中的語言代碼。

如果正常的URL是這樣的:

http://localhost:0000/EN/Product/Shirt

我想實現一個重定向到同一頁面,但不是EN我想FR或任何語言的用戶組。

所以新的URL需要是這樣的:

http://localhost:0000/FR/Product/Shirt

爲了實現這一點,我這樣做:

if ((currentCulture == "A" || currentCulture == "B") && (languageId == "A" || language == "B")) 
{ 
       var urlReferrer = this.Request.UrlReferrer; 
       if (urlReferrer != null) 
       { 
        var currentUrl = urlReferrer.PathAndQuery; 
        var url = "https://" + Request.UrlReferrer.Authority; 

        if ((currentCultureUI == A) && (languageCode == B)) 
        { 
         var aToBPathAndQuery = currentUrl.Replace("A", "B"); 

         return Redirect(url + aToBPathAndQuery); 
        } 

       var bToAPathAndQuery = usersCurrentUrl.Replace("B", "A"); 

       return Redirect(url + bToAPathAndQuery); 

} 

兩個AB都是字符串包含在資源文件,所以我改變了這一點,以節省問題和答案的空間,並保持簡單。現在,如果這些值有變化,它們可以在資源文件中更改一次,並且它們很好。它們可以換成類似A = "English"B = "Spanish"

0

此錯誤(客戶端瀏覽器端錯誤)意味着您無限次地重定向到同一頁面。

我知道你在想檢查重定向到相同的頁面是:

if((currentCulture == "A" && languageId == "B") || (currentCulture == "B" && languageId == "A")) 

而且你可以嘗試使用Request.Url.AbsolutePath避免查詢字符串被重定向期間再次通過。 Request.RawUrl包含查詢字符串,並且languageId可能在其中傳遞。

+0

我的主要問題是'Response.Redirect(Request.RawUrl);'因爲這對我造成了無限循環 – maxshuty

+0

這是因爲你檢查當前的文化代碼是A還是B,以及當用戶切換到 –

+0

只需檢查新語言選擇lnguageId是否與當前不同,並且是A或B之一 –

0

不要打擾這種方法。編輯您的路線配置並將語言添加到路線中。讓您的控制器從新的基礎控制器繼承。覆蓋開啓在基礎控制器中執行。在那裏讀你的路線價值並設定文化。

相關問題