在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) { }
}
public class TestController : Controller
{
[ServiceFilter(typeof(TenantActionFilter))]
public IActionResult Index()
{
int tenantId = ViewData["TenantId"];
return View(tenantId);
}
}
它可以工作,我可以通过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) { }
}
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();
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句