Kje*_*sen 2 asp.net-core-mvc asp.net-core asp.net-core-webapi
在 ASP.Net Core WebApp 中,我想使用 ActionFilter 并将信息从 ActionFilter 发送到它所应用的控制器。
对于 MVC 我可以这样做
public class TenantActionFilter : IActionFilter
{
public void OnActionExecuting(ActionExecutingContext context)
{
//Using some sneaky logic to determine current tenant from domain, not important for this example
int tenantId = 1;
Controller controller = (Controller)context.Controller;
controller.ViewData["TenantId"] = tenantId;
}
public void OnActionExecuted(ActionExecutedContext context) { }
}
Run Code Online (Sandbox Code Playgroud)
public class TestController : Controller
{
[ServiceFilter(typeof(TenantActionFilter))]
public IActionResult Index()
{
int tenantId = ViewData["TenantId"];
return View(tenantId);
}
}
Run Code Online (Sandbox Code Playgroud)
它可以工作,我可以通过 ViewData 将数据传递回控制器 - 太棒了。
我想对 WebApi 控制器做同样的事情。
actionFilter 本身可以应用、运行等 - 但我无法写入 ViewData,因为 WebAPI 继承自 ControllerBase - 而不是从 Controller (如 MVC)继承。
与 MVC 类似,如何将 ActionFilter 中的数据推送回调用的 ControllerBase?
...所以当我快写完问题时我找到了答案,所以这里...
答案是 HttpContext.Items 集合
public class TenantActionFilter : IActionFilter
{
public void OnActionExecuting(ActionExecutingContext context)
{
int tenantId = 1;
var controller = (ControllerBase)context.Controller;
controller.HttpContext.Items.Add("TenantId", tenantId);
}
public void OnActionExecuted(ActionExecutedContext context) { }
}
Run Code Online (Sandbox Code Playgroud)
public class TestApiController : ControllerBase
{
[ServiceFilter(typeof(TenantActionFilter))]
public SomeClass Get()
{
int tenantId;
if (!int.TryParse(HttpContext.Items["TenantId"].ToString(), out tenantId))
{
tenantId = -1;
}
return new SomeClass();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1992 次 |
| 最近记录: |