Я работаю над добавлением новых плагинов в 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.