在FilterProviders中动态添加FIlterDescriptor

时间:2019-05-26 17:05:29

标签: c# asp.net-core nopcommerce

我正在为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中的一个位置编写所有条件。

0 个答案:

没有答案