ASP.Net MVC में वैश्विक फ़िल्टर को चुनिंदा रूप से अक्षम कैसे करें




asp.net-mvc actionfilterattribute (6)

मैंने अपने सभी नियंत्रक कार्यों के लिए एक वैश्विक फ़िल्टर स्थापित किया है जिसमें मैं एनएचबेर्नेट सत्र खोलता हूं और बंद करता हूं। इन कार्रवाइयों में से 9 5% कुछ डेटाबेस पहुंच की आवश्यकता है, लेकिन 5% नहीं है। क्या 5% के लिए इस वैश्विक फ़िल्टर को अक्षम करने का कोई आसान तरीका है। मैं दूसरे तरीके से गोल कर सकता था और केवल उन कार्रवाइयों को सजाने के लिए जो डेटाबेस की आवश्यकता है, लेकिन यह कहीं अधिक काम करेगा।


आप इस तरह अपना फ़िल्टर कोड बदल सकते हैं:

 public class NHibernateActionFilter : ActionFilterAttribute
    {
        public IEnumerable<string> ActionsToSkip { get; set; }

        public NHibernateActionFilter(params string[] actionsToSkip)
        {
            ActionsToSkip = actionsToSkip;
        }

        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            if (null != ActionsToSkip && ActionsToSkip.Any(a => 
String.Compare(a,  filterContext.ActionDescriptor.ActionName, true) == 0))
                {
                    return;
                }
           //here you code
        }
    }

और इसका इस्तेमाल करें:

[NHibernateActionFilter(new[] { "SkipFilterAction1 ", "Action2"})]

आप इस भयानक पोस्ट में वर्णित क्या कर सकते हैं:

एक फ़िल्टर को बाहर निकालें

बस एक कस्टम ExcludeFilterAttribute और फिर एक कस्टम ExcludeFilterProvider

स्वच्छ समाधान और मेरे लिए बहुत अच्छा काम किया!



एक कस्टम फ़िल्टर प्रदाता बनाएँ। एक वर्ग लिखें जो IFilterProvider लागू करेगा। यह IFilterProvider इंटरफ़ेस में एक विधि GetFilters है जो फ़िल्टर लौटाता है जिसे निष्पादित करने की आवश्यकता होती है।

public class MyFilterProvider : IFilterProvider
{
        private readonly List<Func<ControllerContext, object>> filterconditions = new List<Func<ControllerContext, object>>();
        public void Add(Func<ControllerContext, object> mycondition)
        {
            filterconditions.Add(mycondition);
        }

        public IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor)
        {
            return from filtercondition in filterconditions
                   select filtercondition(controllerContext) into ctrlContext
                   where ctrlContext!= null
                   select new Filter(ctrlContext, FilterScope.Global);
        }
}

================================================== ===========================
Global.asax.cs में

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            MyFilterProvider provider = new MyFilterProvider();
            provider.Add(d => d.RouteData.Values["action"].ToString() != "SkipFilterAction1 " ? new NHibernateActionFilter() : null);
            FilterProviders.Providers.Add(provider);
        }


protected void Application_Start()
{
    RegisterGlobalFilters(GlobalFilters.Filters);
}

खैर, मुझे लगता है कि मुझे यह एएसपी.नेट कोर के लिए काम कर रहा है।
यहां कोड है:

public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    {
        // Prepare the audit
        _parameters = context.ActionArguments;

        await next();

        if (IsExcluded(context))
        {
            return;
        }

        var routeData = context.RouteData;

        var controllerName = (string)routeData.Values["controller"];
        var actionName = (string)routeData.Values["action"];

        // Log action data
        var auditEntry = new AuditEntry
        {
            ActionName = actionName,
            EntityType = controllerName,
            EntityID = GetEntityId(),
            PerformedAt = DateTime.Now,
            PersonID = context.HttpContext.Session.GetCurrentUser()?.PersonId.ToString()
        };

        _auditHandler.DbContext.Audits.Add(auditEntry);
        await _auditHandler.DbContext.SaveChangesAsync();
    }

    private bool IsExcluded(ActionContext context)
    {
        var controllerActionDescriptor = (Microsoft.AspNetCore.Mvc.Controllers.ControllerActionDescriptor)context.ActionDescriptor;

        return controllerActionDescriptor.ControllerTypeInfo.IsDefined(typeof(ExcludeFromAuditing), false) ||
               controllerActionDescriptor.MethodInfo.IsDefined(typeof(ExcludeFromAuditing), false);
    }

प्रासंगिक कोड 'IsExcluded' विधि में है।


हालांकि, डारिन डिमिट्रोव द्वारा स्वीकृत उत्तर ठीक है और अच्छी तरह से काम कर रहा है, लेकिन मेरे लिए, here स्थापित सबसे सरल और सबसे कुशल उत्तर here ।

आपको अपनी विशेषता के लिए बस एक बूलियन संपत्ति जोड़ने की आवश्यकता है और इसके तर्क की शुरुआत होने से ठीक पहले इसके खिलाफ जांच करें:

public class DataAccessAttribute: ActionFilterAttribute
{
    public bool Disable { get; set; }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (Disable) return;

        // Your original logic for your 95% actions goes here.
    }
}

फिर अपने 5% कार्यों पर बस इसका इस्तेमाल करें:

[DataAccessAttribute(Disable=true)]
public ActionResult Index()
{            
    return View();
}




global-filter