我希望能夠在將數據填充到ViewData的每個請求上執行一些代碼。目前我有一個基礎控制器類,所有我的控制器繼承,我重寫OnActionExecuting並在那裏。在每個請求上執行代碼
我唯一關心的是這種方法是誰曾經創建一個新的控制器將有繼承形式的基類。
有沒有辦法在global.asax中註冊一些東西,就像使用自定義模型綁定器一樣,它會運行每個請求?有點像全局動作過濾器或其他東西。
我希望能夠在將數據填充到ViewData的每個請求上執行一些代碼。目前我有一個基礎控制器類,所有我的控制器繼承,我重寫OnActionExecuting並在那裏。在每個請求上執行代碼
我唯一關心的是這種方法是誰曾經創建一個新的控制器將有繼承形式的基類。
有沒有辦法在global.asax中註冊一些東西,就像使用自定義模型綁定器一樣,它會運行每個請求?有點像全局動作過濾器或其他東西。
您可以使用custom action invoker,而不是使用基本控制器類(我認爲這是大多數情況下的最佳選擇)。我會從內置的動作調用器中派生出來,並將其添加到所需的額外內容中。您可以在應用程序啓動期間在global.asax中註冊動作調用器,並且可以重寫OnActionExecuting/OnActionExecuted/OnResultExecuting/OnResultExecuted。例如,您可以使用OnResultExecuting添加一些ViewData。此時您將知道已完成的操作並知道ActionResult的類型。
這是什麼我一直在尋找並且應該工作得很好,我已經有了一個自定義控制器工廠,所以我可以關閉會話,所以添加這個很簡單。 – 2009-12-02 15:52:03
在global.asax
中,您可以添加一個處理程序到Application_BeginRequest
,它在每個HTTP請求之前運行。您也可以創建custom HTTP module來處理相同的問題。
是的,我知道這一點。這是所有MVC的東西都被註冊的地方。雖然這裏沒有特定的MVC,但我猜測有一種方法可以添加一些對象,以便我可以使用它。就像添加客戶模型綁定器一樣,您可以在global.asax文件中執行此操作:「ModelBinders.Binders.Add(typeof(MyModelBinder,new MyModelBinder());」然後當模型綁定發生時,您的自定義類會自動調用,因爲你已經註冊了,這是在global.asax文件中完成的。 – 2009-11-30 18:06:56
小事情:從global.asax訪問HttpContext.Current.Session不會工作,因爲這時Session對象沒有設置。 – Moulde 2013-02-22 13:22:06
我對每個項目採取的第一步是添加一個空的控制器基類,以允許所有控制器使用代碼。閱讀MVC in Action後,我習慣了這種習慣,這是作者的建議之一。我認爲你現在採取的方法是正確的。 – mkedobbs 2009-11-30 17:11:16