Динамически добавлять FIlterDescriptors в FilterProviders - PullRequest
0 голосов
/ 26 мая 2019

Я работаю над добавлением новых плагинов в NopCommerce 4.1. Как часть плагина, я реализовал FilterProvider, чтобы динамически добавлять фильтры действий на основе routeData. Ниже приведена реализация «IFPterider» «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.Ruults, как показано в приведенном выше коде, но методы ProductDetailsActionFilter не вызываются. Я что-то пропустил? Ценю твою помощь! Спасибо!

В качестве обходного пути я попытался настроить ActionFIlter напрямую, как показано ниже "

services.Configure<MvcOptions>(config => {
            config.Filters.Add<ProductDetailsActionFilter>();
        });

и в методе фильтра действий «OnActionExecuting» я поставил условие для выполнения только для определенных условий маршрута. и это сработало !!!

Я планировал использовать IFilterProvider, а не настраивать фильтр действий напрямую, потому что у меня много фильтров действий, и я хотел бы закодировать все условия в одном месте в Filterprovider.

...