2009-05-03 44 views
6

我很想聽聽你對以下情形的意見,也許更好的建議:ASP.NET MVC,ActionFilters,靜態類和傳遞數據周圍

我有自定義一個ActionFilter,做了一些工作,出來具有一定的價值。我想在控制器動作和模型中使用該值。

現在,我可以使用TempData將此值從ActionFilter傳遞給任何控制器操作方法,然後將此值分配給傳遞給返回視圖的所有模型。

我確定它會工作,但是這個TempData將會在那裏,當沒有人真的需要它時。該值應該在單個請求的時間內在代碼中專門使用,在此之後,該值有效地失效。

我想出了兩個選項:

  1. 在ActionFilter,我在OnActioExecuting()中的TempData設置這個值,我刪除它OnActionExecuted()。我是否正確理解,在調用OnActionExecuted時,控制器操作已完成,響應是否已生成,並且此TempData內容尚未進入會話YET?

  2. 在我的任何自定義靜態類(邏輯)中,我只是爲這個值定義一個公共屬性,並在需要時使用它。在OnActionExecuting()和實際執行控制器方法之間,這個靜態字段不會丟失嗎?在服務器的請求處理過程中是否還有其他可能會丟失該值的問題?

我還沒有考慮過其他/更好的選擇嗎?

回答

8

我發現使用ActionParameters可以讓你的代碼非常容易測試。你能做到像這樣:

// inside your actionfilter 
public override void OnActionExecuting(ActionExecutinContext context) 
{ 
    var someData = // ... load some data 

    context.ActionParameters["someData"] = someData; 
} 


// and then in your action method 
[ProvideSomeData] 
public ViewResult Index(SomeData someData) 
{ 
    // someData will be populated in here 
} 
+0

其實很有趣。它是否會使動作構造函數參數自動映射到ActionParameters集合鍵? – User 2009-05-03 20:02:09

+0

是的操作參數應該是在控制器中傳遞值的首選方式。 – kazimanzurrashid 2009-05-03 20:41:46

3

重:#2

只是想指出的是,與靜態字段的問題是,多個請求都將使用相同的靜態字段。如果有兩個請求併發執行,那麼請求B將總會覆蓋請求A的值,並且在請求A的操作執行時您將使用錯誤的值。

我會避免使用靜態成員來保存請求的特定信息。