2009-02-03 88 views
7

看起來似乎很簡單,但事實並非如此 - 主要是由於View不可能知道你通過Model和Controller的方式。無論如何,這是一個需要解決方案的問題:如何爲指向登錄表單的鏈接指定返回網址?

我有一個登錄鏈接,需要用戶輸入用戶名和密碼。當用戶點擊「提交」時,我想重定向到他正在查看的頁面。最簡單的方法似乎是將查詢字符串指定給當前頁面的URL(...?returnUrl=...),其他所有內容都已經構建好。

但是在渲染鏈接時,我從哪裏可以找到這個URL?我自然不能使用RedirectToActionResult,因爲我不想實際傳輸用戶 - 只在鏈接中呈現URL。如何?


編輯:

我現在已經開始在這個問題上的賞金,因此,我認爲適當的澄清我的需求也是如此。

我在我的Shared文件夾中有一個名爲Login.ascx的UserControl。其中,我將一個ActionLink呈現給登錄表單,並將其包含在我的主頁面的頁腳中。我想要完成的是以下內容:

當ActionLink被渲染時,查詢字符串returnUrl附加了到目前正在渲染的視圖的路徑。如果這樣做了,用戶將被帶回到他/她在成功登錄後查看的頁面中,該頁面已經構建到ASP.NET MVC框架中。

之前的答案還沒有足夠的原因主要是他們沒有提供一種方法來建立路徑url到當前視圖。我知道如何附加一個查詢字符串,但我不知道如何找出該字符串的內容。

爲了將答案標記爲的答案,我想要一個方法來重新構建到當前顯示的視圖的路徑,從masterpage中的usercontrol。

回答

20

的解決方案是使用HttpContext.Current.Request.RawUrl這樣的:

<%= Html.ActionLink("log on", "LogIn", new { controller = "User", returnUrl = HttpContext.Current.Request.RawUrl }) %> 

或者與來自MVC futures(Microsoft.Web.Mvc.dll)的擴展方法:

<%= Html.ActionLink<AccountController>(c => c.LogOn("name", "password", false, HttpContext.Current.Request.RawUrl), "login here")%> 

ActionController是mvc中的默認選項,但只需將returnUrl添加到自己的。

3

一種方法是構建將用戶發送到登錄表單的鏈接,並返回returnUrl =/PageToReturnTo(例如,<a href="/Account/Login/?returnUrl=/Product/10">Login</a>)。你想寫它,所以返回的URL是從你的路由構造的,但是手動在每個頁面上寫這些鏈接可能會很麻煩。

MVC中的默認登錄操作已經創建了returnUrl功能。只需要傳遞一個值,剩下的就完成了。以下是新項目中方法簽名的複製粘貼。

public ActionResult Login(string username, string password, bool rememberMe, string returnUrl) 

希望能幫助你!

+0

感謝您的回覆!我已經得到了這麼多 - 這是從我的路線構建returnUrl,我不知道該怎麼做。該鏈接位於我的母版頁上,因此對每個頁面上的鏈接進行硬編碼不是一種選擇。 – 2009-02-03 08:06:20

+0

另外,ASP中的標準授權會將?returnURL添加到任何位於受保護區域中的請求(即具有帶允許/拒絕規則的web.config文件)。 – 2009-02-13 15:01:36

0

我不知道ASPX,但也有一對夫婦,我們遇到了建立這個問題:

當用戶得到他們的密碼錯誤,並循環輪的登錄頁面有另一個去,目標必須保留。

我們還決定保留POST變量來一個網頁,然後在需要的只是即時登錄

1

您可以使用Page.Request.Url來獲取導致當前渲染視圖的路線。

雖然這更多的是一個美化的細節,但您可能希望統一通過「/」和「/default.aspx」路線發出的請求,並始終返回到「/」路線。我的母版頁中有一個輔助屬性,它就是這樣做的。

protected Uri RouteUrl 
    { 
     get 
     { 
      if (Page.Request.Url.AbsolutePath.StartsWith("/default.aspx", StringComparison.OrdinalIgnoreCase)) 
      { 
       return new Uri(Request.Url, new Uri(Response.ApplyAppPathModifier("~/"))); 
      } 

      return Page.Request.Url; 
     } 
    } 
相關問題