我正在尝试编写一些中间件,并且需要知道当前的操作方法(如果有的话)是否具有特定的过滤器属性,因此我可以根据它的存在来改变行为。
因此,当您实施IList<IFilterMetadata>
时,可以像ResourceExecutingContext
那样获得IResourceFilter
类型的过滤器集合吗?
答案 0 :(得分:4)
今天真的不可能。
答案 1 :(得分:3)
ASP.NET Core 3.0使用新的路由,每个动作都是Endpoint
,并且动作和控制器上的所有属性都位于Metadata
上。
这是您的操作方式。
app.UseRouting();
app.Use(async (context, next) =>
{
Endpoint endpoint = context.GetEndpoint();
YourFilterAttribute filter = endpoint.Metadata.GetMetadata<YourFilterAttribute>();
if (filter != null)
{
}
await next();
});
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
答案 2 :(得分:0)
注意:并非真正直接回答您的问题,但可能会根据您的需求提供帮助(并且代码的评论时间太长)
注意2:不确定它是否适用于Core,如果没有,请告诉我并删除答案
您可以在过滤器中知道是否使用了另一个过滤器:
public class OneFilter : ActionFilterAttribute, IActionFilter
{
void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
{
// Check if the Attribute "AnotherFilter" is used
if (filterContext.ActionDescriptor.IsDefined(typeof(AnotherFilter), true) || filterContext.Controller.GetType().IsDefined(typeof(AnotherFilter), true))
{
// things to do if the filter is used
}
}
}
public class AnotherFilter : ActionFilterAttribute, IActionFilter
{
// filter things
}
和/或
您可以在路线数据中放入一些数据,以了解使用过滤器的操作:
void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.RouteData.Values.Add("OneFilterUsed", "true");
base.OnActionExecuting(filterContext);
}
...
public ActionResult Index()
{
if(RouteData.Values["OneFilterUsed"] == "true")
{
}
return View();
}