2

我想製作一個包含Message屬性的自定義AuthorizeAttribute。問題是,我的FormsAuthentication重定向到指定的loginUrl。該視圖如何訪問屬性的Message屬性?當用ASP.NET MVC重定向到FormsAuthentication登錄頁面時顯示有用的消息

例如,我用我的自定義AuthorizeAttribute

[Authorize(Message="You must be logged in to see user settings.")] 
public ActionResult Settings() 
{ 
    return View(); 
} 

它被重定向到/帳號/登錄(由於在web.config中FormsAuthentication設置),如果用戶沒有登錄。我有這個動作要顯示這樣用戶就知道爲什麼他們被重定向到登錄頁面

+0

你需要做什麼?你需要從控制器傳遞一個字符串到視圖嗎? – Oliver 2011-05-28 23:11:28

+0

從控制器屬性到它導致重定向到的視圖。不是從設置操作到設置視圖,而是從設置操作屬性到登錄視圖 – 2011-05-28 23:22:19

回答

5

一種選擇是將Message屬性的值放入您自定義的AuthorizeAttribute的HandleUnautherizeRequest方法中的TempData中。然後在帳戶控制器的LogOn操作中,從TempData獲取該值並將其放入ViewBag或您的模型中,以便View可以訪問它。

AuthorizeAttribute:

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
{    
    base.HandleUnauthorizedRequest(filterContext); 
    filterContext.Controller.TempData["MessageFromMyAttribute"] = this.Message; 
} 

的AccountController

public ActionResult LogOn() 
{ 
    ViewBag.AttributeMessage = TempData["MessageFromMyAttribute"]; 
    return View(); 
} 

由於MVC是做幕後重定向在TempData的值會跨越重定向堅持。

+0

...這幾乎是托馬斯剛剛說的關於一分鐘前的內容:) – 2011-05-29 00:30:48

+1

我考慮包括代碼示例,但決定代替第一個答案;)(可能不會在飛行中獲得代碼) – 2011-05-29 00:35:54

+1

感謝這工作完美。我從來不知道'TempData'的用途是什麼 - 我總是在intellisense中看到它,認爲它不相關,並且從那時起忽略它。現在我明白了 :) – 2011-05-29 00:52:42

2

執行以下操作:「你必須先登錄才能看到用戶設置」登錄查看:

  1. 創建自己的屬性,從AuthorizeAttribute
  2. 繼承了你的過濾器,郵件添加到TempData
  3. 在您重定向時,需要登錄到行動,從TempData得到消息,並把它傳遞給視圖。
相關問題