with vistas vista parciales net mvc introducción formularios español desarrollo con asp c# asp.net-mvc action-filter

c# - vistas - mvc with asp net



ASP.NET MVC: Registro de filtro de acción sin modificar el controlador (5)

Estoy trabajando con nopCommerce y necesito agregar mi único Filtro de Acción, sin embargo, no quiero modificar los controladores centrales para evitar que mi código se sobrescriba cuando se lanza una nueva actualización.

He configurado mi filtro de acción:

public class ProductActionFilterAttribute : ActionFilterAttribute { public override void OnActionExecuted(ActionExecutedContext filterContext) { if (filterContext.Result is ViewResult) { ... } base.OnActionExecuted(filterContext); } }

Si tuviera que modificar el controlador, solo podría agregar [ProductActionFilter] a la acción a la que quiero asignarlo.

¿Hay alguna manera de registrar mi Filtro de acción personalizado en una acción específica sin modificar el controlador?


¿Qué pasa con la creación de una clase parcial. A partir de la versión 2.60 todos los controladores son parciales:

public partial class CatalogController : BaseNopController

Puede poner el filtro a la clase y luego consultar el nombre de la acción.


Creo que los filtros globales es lo que necesitas.

Una vez que haya creado el filtro, regístrelo en global.asax:

protected void Application_Start() { AreaRegistration.RegisterAllAreas(); // Register global filter GlobalFilters.Filters.Add(new MyActionFilterAttribute()); RegisterGlobalFilters(GlobalFilters.Filters); RegisterRoutes(RouteTable.Routes); }

Agregue lógica de validación personalizada para filtrar si no desea aplicarla a todas las acciones.


En NopCommerce 3.5 (la última versión de esta respuesta, y más reciente que la fecha de la pregunta), la mejor manera que he encontrado para agregar un filtro de acción global es mediante la creación de un complemento con una implementación IStartupTask . Este método evita completamente la alteración de los archivos principales de NopCommerce.

El evento EngineContext Application_Start inicializa EngineContext , que crea la instancia de NopEngine . La inicialización de NopEngine encuentra todas IStartupTask implementaciones de IStartupTask y las ejecuta en el orden especificado. Por lo tanto, una IStartupTask es el lugar para hacer cualquier cosa que deba suceder en el inicio de la aplicación.

Código de muestra a continuación:

public class Plugin : BasePlugin { public Plugin() { } /// <summary> /// Check to see if this plugin is installed /// </summary> public static bool IsInstalled(ITypeFinder typeFinder) { IEnumerable<Type> types = typeFinder.FindClassesOfType<IPluginFinder>(true); if (types.Count() == 1) { IPluginFinder plugins = Activator.CreateInstance(types.First()) as IPluginFinder; PluginDescriptor descriptor = plugins.GetPluginDescriptorBySystemName("MyPluginName"); if (descriptor != null && descriptor.Installed) { return true; } } return false; } } /// <summary> /// Redirects to the 404 page if criteria not met /// </summary> public class FluffyTextureRequiredAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { if (Kitten.Texture != Textures.Fluffy) { var routeValues = new RouteValueDictionary(); routeValues.Add("controller", "Common"); routeValues.Add("action", "PageNotFound"); filterContext.Result = new RedirectToRouteResult(routeValues); } } } /// <summary> /// Does application start event stuff for the plugin, e.g. registering /// global action filters /// </summary> public class StartupTask : IStartupTask { private ITypeFinder _typeFinder; public StartupTask() { //IStartupTask objects are created via Activator.CreateInstance with a parameterless constructor call, so dependencies must be manually resolved. _typeFinder = EngineContext.Current.Resolve<ITypeFinder>(); } public void Execute() { // only execute if plugin is installed if (Plugin.IsInstalled(_typeFinder)) { // GlobalFilters is in System.Web.Mvc GlobalFilters.Filters.Add(new FluffyTextureRequiredAttribute()); } } public int Order { get { return int.MaxValue; } } }


Este enfoque funciona para NopCommerce 4.10

Este código redirigirá las solicitudes "/ Register" con el método "GET" a la acción "YourCustomAction" dentro de "YourCustomController".

Paso 1: implementar INopStartup

public class NopStartup : INopStartup { public void ConfigureServices(IServiceCollection services, IConfiguration configuration) { services.Configure<MvcOptions>(config => { config.Filters.Add<YourCustomActionFilter>(); }); } public void Configure(IApplicationBuilder application) { } public int Order => 0; }

Paso 2 :

public class YourCustomActionFilter : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext context) { if (!(context.ActionDescriptor is ControllerActionDescriptor actionDescriptor)) return; if (actionDescriptor.ControllerTypeInfo == typeof(CustomerController) && actionDescriptor.ActionName == "Register" && context.HttpContext.Request.Method == "GET") { string controllerName = nameof(YourCustomController).Replace("Controller", ""); string actionName = nameof(YourCustomController.YourCustomAction); var values = new RouteValueDictionary(new { action = actionName, controller = controllerName }); context.Result = new RedirectToRouteResult(values); } } }

Con este enfoque, puede reducir el proceso de registro y agregar algunos controles / procesos adicionales, luego puede continuar con el proceso de registro.


Si desea que su filtro se registre para cada acción (o de lo contrario está bien hacerlo), MVC 3 le permite aplicar filtros de acción globales . Por supuesto, esto requiere que nopCommerce esté basado en MVC 3, lo que creo que es la versión más reciente.