我正在为NopCommerce 4.1添加新的插件。作为插件的一部分,我实现了FilterProvider,以便基于routeData动态添加动作过滤器。以下是“ IFilterProvider”的“ OnProvidersExecuting”实现。
public void OnProvidersExecuting(FilterProviderContext context)
{
var controllerContext = context.ActionContext.ActionDescriptor as ControllerActionDescriptor;
if (controllerContext.ControllerTypeInfo.AsType() == typeof(ProductController)
&& controllerContext.ActionName.Equals("ProductDetails", StringComparison.InvariantCultureIgnoreCase))
{
var actionDescriptor = (context.ActionContext.ActionDescriptor as ControllerActionDescriptor);
if (!actionDescriptor.FilterDescriptors.Any(x => x.Filter.GetType() == typeof(ProductDetailsActionFilter)))
{
context.Results.Add(new FilterItem(new FilterDescriptor(new ProductDetailsActionFilter() { }, FilterScope.Action)));
}
}
}
如上所述,我已将'ProductDetailsActionFilter'添加到请求的动作过滤器列表中,希望ProductDetailsActionFilter将作为执行管道的一部分执行,但是'OnActionExecuting'或'OnActionExecuted'不会执行。以下是动作过滤器的定义:
public class ProductDetailsActionFilter : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutedContext filterContext)
{
var controllerContext = filterContext.ActionDescriptor as ControllerActionDescriptor;
if (filterContext.Controller.GetType() == typeof(ProductController)
&& controllerContext.ActionName.Equals("ProductDetails", StringComparison.InvariantCultureIgnoreCase)
&& (filterContext.HttpContext.Request.Method == "POST" || filterContext.HttpContext.Request.Method == "GET"))
{
var result = filterContext.Result as ViewResult;
if (result != null)
{
ExecuteResult(result);
}
}
base.OnActionExecuting(filterContext);
}
}
以下是添加服务的代码:
services.TryAddEnumerable(ServiceDescriptor.Singleton<IFilterProvider, MyFilterProvider>());
我看到正在执行'MyFilterProvider'并且正在将FilterItem添加到context.Results如上面的代码所示,但是没有调用'ProductDetailsActionFilter'方法。我想念什么吗?感谢您的帮助!谢谢!
作为一种变通办法,我尝试直接按如下所示配置ActionFIlter”
services.Configure<MvcOptions>(config => {
config.Filters.Add<ProductDetailsActionFilter>();
});
并在动作过滤器的“ OnActionExecuting”方法中,我放置了一个条件,仅针对特定的路线条件执行。这行得通!!!
我计划使用IFilterProvider而不是直接配置动作过滤器,因为我有很多动作过滤器,而且我想在Filterprovider中的一个位置编写所有条件。