2012-03-31 6 views
56

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

+1

एक और कार्रवाई बनाने और इस के साथ 5% को सजाने के बारे में क्या। NHibernateNotRequiredAttribute() की तरह कुछ? – dreza

+0

https://weblogs.asp.net/imranbaloch/new-filter-overrides-in-asp-net-mvc-5-and-asp-net-web-api-2 – dovid

उत्तर

109

आपको एक मार्कर विशेषता लिख ​​सकते हैं:

public class SkipMyGlobalActionFilterAttribute : Attribute 
{ 
} 

और फिर कार्रवाई पर इस मार्कर की उपस्थिति के लिए अपने वैश्विक कार्रवाई फिल्टर परीक्षण में:

public class MyGlobalActionFilter : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (filterContext.ActionDescriptor.GetCustomAttributes(typeof(SkipMyGlobalActionFilterAttribute), false).Any()) 
     { 
      return; 
     } 

     // here do whatever you were intending to do 
    } 
} 

और फिर अगर आप छोड़ना चाहते हैं वैश्विक फ़िल्टर से कुछ क्रियाएं इसे मार्कर विशेषता के साथ सजाते हैं:

[SkipMyGlobalActionFilter] 
public ActionResult Index() 
{ 
    return View(); 
} 
+0

वास्तव में बहुत अच्छा समाधान। मुझे आश्चर्य है कि मैंने इसे अपने बारे में क्यों नहीं सोचा था। धन्यवाद। – zszep

+1

अच्छा आसान समाधान। धन्यवाद! –

+0

ग्रेट सॉल्यूशन। तुम मेरा समय बचाओ :) – Ankita

1

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

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"})] 
+1

यह करने के लिए एक ही रास्ता है, लेकिन थोड़ा समय। – zszep

+1

से अधिक बनाए रखने के लिए आप अपनी कार्रवाई का नाम बदलने और विशेषता के उपयोग में इसे बदलने के लिए भूल जाते हैं मुश्किल है यही कारण है कि, कंपाइलर आपको चेतावनी नहीं देगा। यह रखरखाव दर्द का कारण बनने की संभावना है। मुझे डारिन का जवाब पसंद है क्योंकि आपको मैन्युअल रूप से क्रियाएं निर्दिष्ट करने की आवश्यकता नहीं है। – Nashenas

16

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

Exclude A Filter

बस को लागू एक कस्टम ExcludeFilterAttribute और उसके बाद एक कस्टम ExcludeFilterProvider

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

+1

एस्पनेट कोर के लिए कोई समान समाधान? – smg

-1

यह करने के लिए सबसे अच्छा जवाब एक अलग प्रश्न पर प्रदान की जाती है:

MVC 3 GlobalFilters Exclude

2

एक कस्टम फ़िल्टर प्रदाता बनाएँ। एक वर्ग लिखें जो 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); 
} 
0
खैर

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

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' विधि में है:
कोड यह रहा।

0

कम से कम आजकल, यह काफी आसान है: किसी एक्शन से सभी एक्शन फ़िल्टर को बाहर करने के लिए, बस ओवरराइडएक्शनफिल्टर एट्रिब्यूट जोड़ें। OverrideAuthenticationAttribute, OverrideAuthorizationAttribute और OverrideExceptionAttribute:

अन्य फ़िल्टर के लिए इसी तरह के गुण हैं।

भी देखें https://www.strathweb.com/2013/06/overriding-filters-in-asp-net-web-api-vnext/

संबंधित मुद्दे