2013-02-25 64 views
23

我在動作過濾器中拉動一些用戶數據,並可能在控制器的動作中使用某些數據,但並不完全知道如何將數據從過濾器傳遞到控制器。 在MVC中,我可能會使用session或HttpContext.Items,但它在web api中不可用。另一種選擇是使用ThreadStatic,但我認爲必須有更好的解決方案?WebApi:如何將狀態從過濾器傳遞到控制器?

回答

46

您可以使用Request.Properties字典來做到這一點。

在過濾:

MyType myObject = //initialize from somwhere 
actionContext.Request.Properties.Add("mykey", myObject); 

然後你就可以在控制器中檢索:

object myObject; 
Request.Properties.TryGetValue("mykey", out myObject); 
//cast to MyType 

這種方法的優點是,當前請求實例隨處可用的網絡API中管道,所以你可以訪問這個對象,也就是在Formatter或者MessageHandler中。

+0

我的請求對象沒有屬性,只有Params。有區別嗎?它不直接存在於filterContext中,而是存在於filterContext.HttpContext中。 – 2014-09-28 07:18:54

+0

然後你正在處理MVC過濾器而不是Web API過濾器 - 第一個與ASP.NET MVC管道一起使用,並且是system.web.mvc的成員,而後者與ASP.NET Web API管道一起使用,並且是系統的成員.web.http。不要混淆他們,他們是不同的組件 – 2014-09-28 08:41:57

+0

啊,我的錯誤。 – 2014-09-28 10:09:34

相關問題