MVC和WebAPI如何從Filter向Action中傳遞數據
http://www.itfanr.cc/2016/04/17/transfer-data-from-filter-to-action/
MVC和WebAPI如何從Filter向Action中傳遞數據
需求
最近在策劃實現MVC項目中用戶身份驗證的功能時,考慮用MVC中的Filter過濾器來先從url鏈接中獲取傳遞過來的token,在Filter中通過token獲取用戶的信息后,如果用戶信息正確,則傳遞到Controller的Action中進行用戶數據的操作。
那么,要如何從Filter中向Action中傳遞數據呢?
how to pass data from filter to controller?
注意:下面所提到的Filter都指實現ActionFilterAttribute的過濾器
MVC中 從Filter過濾器向Action中傳遞數據
方法一 通過 RouteData 來傳值
1 |
//賦值: |
測試通過。
詳見: ASP.NET MVC Pass object from Custom Action Filter to Action - Stack Overflow
方法二 通過 ActionParameters 來傳值
另一種方法是通過 ActionParameters 來設置,但在Action中是通過添加參數獲取值的:
1 |
//賦值: |
詳見: Manipulating Action Method Parameters - You’ve Been Haacked
通過測試,發現這種方法可以隱藏真實的Action方法:
比如:
請求的鏈接是 http://localhost:47760/home/show?id=3&name=abc
而實際的Action為:
1
|
public ActionResult Show(string aaa){}
|
那么可以通過添加一個 ActionFilterAttribute 過濾器,并設置:
1 |
this.Uname=getquerystring.name; |
這樣雖然url中請求的參數時id和name,而實際請求參數是aaa;
而實際的請求鏈接 http://localhost:47760/home/show?aaa=haha 也是可以訪問的。
方法三 通過 HttpContext.Items 來傳值
1 |
//Filter中賦值: |
測試通過。
通過測試發現好像這種方式比較合適。因為:可看到Items的解釋為:
在派生類中重寫時,獲取一個鍵/值集合,該集合在 HTTP 請求過程中可以用于在模塊與處理程序之間組織和共享數據。
詳見: asp.net mvc - Accessing Action Filter's data in Controller Action - Stack Overflow
WebAPI中從Filter向Action中傳遞數據
如何從Filter向Action中傳遞數據?
方法一 通過 Request.Properties 來傳值
1 |
//Filter中賦值: |
或:
1 |
//賦值: |
測試通過。
詳見:
- asp.net web api - WebApi: how to pass state from filter to controller? - Stack Overflow
- asp.net web api - Pass an object from ActionFilter.OnActionExecuting() to an ApiController - Stack Overflow
總結
MVC 用 :
1
|
filterContext.HttpContext.Items[UnitOfWorkRequestKey] = UnitOfWork;
|
Web API 用 :
1
|
actionContext.Request.Properties[UnitOfWorkRequestKey] = UnitOfWork;
|
詳見: c# - Web API Action Filter - Controller.TempData equivalent? - Stack Overflow

浙公網安備 33010602011771號