2010-05-14 68 views
6

我只是ASP.NET MVC的新手,我不知道如何實現某個任務的「正確方式」。ASP.NET MVC AuthorizeAttribute將值傳遞給ActionMethod?

本質上,我將登錄的userId存儲在HttpContext.User.Identity中,並且編寫了一個EnhancedAuthorizeAttribute來執行一些自定義授權。

在覆蓋OnAuthorization方法中,我的域模型命中數據庫以確保當前用戶標識可以訪問傳入的routeValue「BatchCode」。原型是:

ReviewGroup GetReviewGroupFromBatchCode(string batchCode); 

如果用戶無法訪問ReviewGroup並且OnAuthorization會拒絕訪問,它將返回null。

現在,我知道裝飾的操作方法只會在OnAuthorization通過時執行,但我不想再次點擊數據庫以再次獲取ReviewGroup。

我在考慮將ReviewGroup存儲在HttpContext.Items["reviewGroup"]中,並且現在可以從控制器訪問它。

這是一個可行的解決方案,還是我在錯誤的道路上?

謝謝!

回答

1

HttpContext.Items僅在請求期間處於活動狀態。如果你要堅持它的時間較長,就應該把它放在

一)會議 - 好

二)個人資料 - 看不出優勢

C)餅乾 - 不推薦

d)每次點擊數據庫 - 應該是OK

將它存儲在filterContext.RouteData.DataTokens?

+0

嗯不,我不需要ReviewGroup對象多於一個請求。真的,我需要的只是將這個對象(在AuthorizeAttribute.OnAuthorization()中獲得)傳遞給ActionMethod()。 – 2010-05-14 02:07:24

0

除非你從ReviewGroup做的非常大的選擇,或者你有一個巨大的數據庫,然後第二個數據庫命中不會太多的問題。現代數據庫在進行選擇時非常高效,特別是在索引表正確的情況下。

根據我的經驗,這是進行授權的最佳方式,以及如何在我的應用程序中授權特定操作的類似方法。

因此,總之,我不擔心第二個數據庫命中。

1

或者,避免碰到數據庫最簡單的方法之一是緩存。 檢索它,將其粘貼在緩存中。如果它再次需要它已經在內存中,並且不需要數據庫命中。如果不是,那麼當緩存超出範圍時,對象也是如此。