2010-12-10 51 views
1

我使用ASP.NET MVC2 Web應用程序創建了一個新的MVC2項目,該應用程序爲我提供了默認網站。我添加了一個簡單的區域,其中有一個主控制器和一個索引視圖。這引發了編譯器的第一個問題:「找到與控制器名稱'Home'匹配的多個類型」。我將Home更改爲Main並編譯。使用UrlReferrer返回到區域內的呼叫頁面

我添加了一個新選項卡來引用我的區域中的索引視圖,打開網站並開始單擊選項卡。當我訪問了該地區索引頁,我不能回到主頁或關於頁面不改變菜單,如下所示:

<ul id="menu">    
    <li><%= Html.ActionLink("SampleArea.Main", "Index", "Main", new { area = "SampleArea" }, null)%></li> 
    <li><%= Html.ActionLink("Home", "Index", "Home", new { area = "" }, null)%></li> 
    <li><%= Html.ActionLink("About", "About", "Home", new { area = "" }, null)%></li> 
</ul> 

然後我可以通過正確的選項卡循環。後來我改變在賬戶控制器註銷視圖的代碼,如下所示:

public ActionResult LogOff() 
{ 
    FormsService.SignOut(); 

    //return RedirectToAction("Index", "Home"); 
    return RedirectToAction(Request.UrlReferrer.AbsolutePath.ToString()); 
} 

我使用UrlReferrer.AbsolutePath如果用戶註銷時返回到調用頁面。如果調用頁面恰好是SampleArea中的視圖,則.​​AbsolutePath包含「/ SampleArea」。這是因爲控制器和視圖是默認設置,所以它們不包括在內。繼續,我收到以下錯誤消息:

無法找到該資源。
描述:HTTP 404.您正在查找的資源 (或其中一個 依賴關係)可能已被刪除, 的名稱已更改,或者 暫時不可用。請 查看以下URL並確保 拼寫正確。

請求的URL:/帳號/ SampleArea

我的理解是,/帳戶已被添加,因爲這是它被執行註銷等當控制器。它認爲/ SampleArea是一個動作,因此添加了當前控制器來完成路由。

使用UrlReferrer.AbsolutePath,有沒有什麼方法可以指定SampleArea作爲區域,還是有其他方法可以返回到正確的頁面?

新增
這比我想象的還要陌生。我打開了我目前正在開發的網站,並將LogOut中的return語句更改爲使用AbsolutePath返回。斷點顯示它包含「/ Club/PrivacyPolicy」。不過,我得到以下區別相同的錯誤消息:

請求的URL:/登錄/俱樂部/個人信息保護

爲什麼地球上應該將其與/登錄前綴它是一個視圖,而比/帳戶是一個控制器?事實上,它爲什麼要用任何東西加上前綴呢?/Club/PrivacyPolicy 是Global.asax.cs中的有效路由。

+1

這並不直接回答你的問題,但我會小心依賴UrlReferrer,因爲一些代理服務器和防火牆將它從響應中剝離出來作爲安全措施。 – JasonS 2010-12-10 18:53:31

+0

這是爲什麼?這個價值肯定是由系統設定的,所以不應該有惡意注入的提示。 – xiecs 2010-12-11 09:50:34

+0

referrer經常被防火牆,防病毒軟件,代理等切斷。所以你不應該依賴你的代碼邏輯來處理這些數據。 – zerkms 2010-12-11 13:09:44

回答

0

我終於想出瞭如何返回到您在觸發LogOn或LogOut請求時所處的頁面。我已經使用了下面的一段代碼。

Html.ActionLink("Member LogOn", "LogOn", "Account", new { area = "", returnUrl = HttpContext.Current.Request.RawUrl }, null) 

這產生

<a href='/LogIn/LogOn?returnUrl=%2FContactUs'>Member LogOn</a> 

例如。

在我HttpPost的ActionResult登錄,然後我有

if (!String.IsNullOrEmpty(returnUrl)) 
{ 
    return Redirect(returnUrl); 
} 
    else 
{ 
    return RedirectToAction("Index", "Home"); 
} 

有時候我發現我只需要HttpContext.Request.RawUrl。

我不太確定它爲什麼生成/ LogIn/LogOn而不是/ Account/LogOn,但它按預期工作。

+0

我發現它有/ LogIn/LogOn而不是/ Account/LogOn的原因。我從LogIn更改爲LogOn作爲視圖名稱,但我沒有更改Global.aspx中的路由定義。一旦我改變它們就變成了/ Account/LogOn。 – xiecs 2010-12-21 09:07:47

+0

上面這段代碼可能會導致開放重定向攻擊。在MVC3中,「if(!String.IsNullOrEmpty(returnUrl))」應該被編碼爲「if(Url.IsLocalUrl(returnUrl))」。這是由Jon Galloway的最新博客提供的。 – xiecs 2011-01-27 10:03:19