2013-11-25 21 views
1

在我正在處理的網站上,網站上有不同權限的用戶。需要訪問所有視圖中的變量

鑑於我們目前正在查看的計劃ID和員工ID,我們可以獲得他們的角色特定權限。

現在,我們的BaseModel有一個屬性,可以正確訪問數據庫並獲取此信息。 對於將模型傳遞給視圖的所有視圖,一切運行良好。

問題在於沒有通過模型的Controller方法。在一些視圖中,它們提供的只是幾個ViewBag條目,並且工作正常。

但是,我/需要/在這些頁面CurrentPermissions屬性儘管如此,爲佈局。無論權限是否有一個布爾值設置爲true/false,可能會/可能不會顯示/填充某些內容。

所以,我的選擇似乎是:

  • 不知怎麼把我的CurrentPermissions成ViewBag條目的所有意見,並通過替代示範基地訪問。
    • 我不知道如何做到這一點。我見過使用OnActionExecuting的人,但是由於我與TransactionManager的連接尚未設置,因此失敗了。
  • 以某種方式將BaseModel引入到當前未傳遞模型的視圖中。我儘可能避免這種情況。我不知道我會如何去做這件事,但似乎會讓情況過度複雜化。

我該如何去推動這一CurrentPermissions對象(從我的事務管理器調用生成)的每一個視圖(具體而言,佈局!)

+0

請勿從模型類訪問數據庫......如果訪問數據庫,您甚至無法將該類稱爲模型。模型可以由控制器,MVC過濾器填充,但不能由自己填充。 –

回答

1

你的方法是什麼,我們在出項目中使用...我們使用這種方法系統地刪除使用ViewBag將其更改爲ViewModels。

我們已經使用過的其他方法(對於我的例子中的UserPreferences)添加了一個ActionFilter,它包含ViewBag中的首選項。你裝飾用[IncludePreferences]的行動需要它在我的情況(這是我的篩選器屬性的名稱

編輯ActionFilter:

public class IncludePreferencesAttribute : ActionFilterAttribute 
{ 
     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
       var controller = filterContext.Controller as BaseController; 

       // IController is not necessarily a Controller 
       if (controller != null) 
       { 
        //I have my preferences in the BaseController 
        //and cached but here you can query the DB 
        controller.ViewBag.MyPreferences = controller.TenantPreferences; 
       } 
     } 
} 

在你的行動,你使用[IncludePreferences]

+0

在我們的例子中,ActionFilter可能是最有意義的,但我對於我可以改變的東西有限制。爲此添加一個全新的ActionFilter看起來有點像矯枉過正,所以我不能證明它非常好! – statue

+0

您可以創建一個ActionFilter ...並在您需要的操作中使用它。如果你喜歡我可以發佈我在動作過濾器中使用的代碼。 – Romias

+0

它不會傷害;我可能不會使用它,但它可能是未來的一個很好的參考,所以我可以在家中深入探索ActionFilters! – statue

0

作爲裝飾它一個臨時解決方案,我在我的佈局頂部執行以下操作:

@{ OurModel.SupervisorRestriction CurrentSupervisorRestrictions = ViewBag.CurrentSupervisorRestrictions ?? Model.CurrentSupervisorRestrictions; } 

這樣,如果我們傳遞一個對象,那麼它的工作就好了。否則,我會直接從控制器傳入ViewBag.CurrentSupervisorRestrictions。只有少數情況,所以沒那麼糟糕。

不過,更好的建議會很棒。