2011-08-21 98 views
1

我有一個ApplicationController,我的應用程序中的每個控制器都繼承。基本控制器

public abstract class ApplicationController : Controller 
public class HomeController : ApplicationController 
public class AnnouncementController : ApplicationController 

我的應用程序(內部網)也使用Windows身份驗證,並提取當前用戶的域登錄名。當用戶的登錄名包含站點ID時,我需要控制器在下拉列表中顯示一個視圖,最好是帶有站點列表的小型彈出窗口,供用戶選擇。

問題1:該功能是否應該在ApplicationController中實現,以便所有派生類都不需要實現這種檢查?如果是,那麼在派生類實例化過程中如何調用此方法?目前,ApplicationController只包含構造函數,沒有其他方法。
問題2:在用戶會話期間,如何使用會話和其他類型的持久性存儲來持久保存此選定的站點ID?

謝謝。

回答

1

如果每次調用都需要進行檢查,我會創建一個屬性並用它來裝飾基礎控制器類。請務必使用AttributeUsage來修飾您的新屬性,以便在所有繼承控制器上調用它。

[AttributeUsage (AttributeTargets.All, Inherited = true)] 
public CheckStuffAttribute : ActionFilterAttribute 
{ 
    // This is one method you can override to get access 
    // to everything going on before any actions are executed. 
    public override void OnActionExecuting (ActionExecutingContext filterContext) 
    { 
     // Do your checks, or whatever you need, here 
    } 
} 

... 

[CheckStuff] 
public abstract class ApplicationController : Controller { ... } 

至於第二個問題,您可以在使用Session作爲其後備存儲的基類上創建屬性。

[CheckStuff] 
public abstract class ApplicationController : Controller 
{ 
    public string DataToKeepAlive 
    { 
     get { return (string)Session["MyKey"]; } 
     set { Session["MyKey"] = value; } 
    } 
} 

將這些屬性設爲公開將使您的自定義屬性可以訪問它們。

+0

如何使用新屬性在ApplicationController中返回View Result? – user266909

+0

您可以在屬性中設置ActionResult(例如重定向到登錄頁面或404頁面),或者您可以像通常那樣使用您的操作。不過,我需要更多的上下文和細節才能真正回答這個問題。 –

+0

我需要什麼時,用戶的Windows登錄名稱不包含說「XYZ」比顯示一個視圖頁面或包含用戶選擇的所有站點名稱的JSON?我不知道如何在ApplicationController類中做出動作,以及如何從派生類中調用它。謝謝。 – user266909