7

मेरे पास एक साधारण एएसपी.NET एमवीसी 3 एप्लिकेशन है जिसमें कुछ नियंत्रक और कुछ अच्छे कार्य हैं।एएसपी.नेट एमवीसी 3: व्यस्त प्राधिकरण विशेषता

अब, क्योंकि यह उपयोगकर्ता आधारित एप्लिकेशन है, अधिकांश नियंत्रक कार्यों को उपयोगकर्ता को प्रमाणित करने की आवश्यकता होती है। एमवीसी अंतर्निहित प्राधिकृत विशेषता के साथ इस अच्छी तरह से संभालती है जिसका उपयोग आप नियंत्रकों और/या कार्यों को व्यक्तिगत रूप से सजाने के लिए कर सकते हैं। ,,)

लेकिन मैं के साथ एक नियंत्रक है का कहना है की सुविधा देता है; बचाया टाइपिंग के बहुत सारे -

बड़ी बात आप विशेषता बस नियंत्रक और कहा कि यह देखते हुए नियंत्रक के लिए सभी कार्यों यह भी आवेदन किया है जाएगा करने के लिए आवेदन कर सकते हैं 10 कार्य लेकिन मैं चाहता हूं कि किसी एक क्रिया को प्राधिकृत विशेषता लागू न हो।

हां, मैं अन्य 9 में विशेषता लागू कर सकता हूं और इसे नियंत्रक से हटा सकता हूं जो मुझे वही करेगा जो मुझे चाहिए। लेकिन क्या इसे नियंत्रक पर लागू रखने का कोई तरीका है और केवल एक क्रिया को बाहर करने का चयन करें?

प्रभावी ढंग से, की तरह कुछ चाहेगा ...

[!Authorize] या [NotAuthorize]

मैं जानता हूँ कि मैं एक कस्टम एक है कि काम करेगा बना सकते हैं, लेकिन क्या मैं जानना चाहता हूँ है अगर वहाँ एक बनाया है ऐसा करने के लिए? या क्या मुझे सभी 9 अन्य कार्यों में विशेषता लागू करनी है?

उत्तर

2

फिल Haack लिखा एक ब्लॉग पोस्ट हाल ही में इस सटीक परिदृश्य के साथ काम:

Conditional Filters in ASP.NET MVC 3

उनका समाधान भी शामिल है "सशर्त फिल्टर प्रदाता" एक कस्टम लेखन है कि एक एक कार्रवाई की विशेषताओं के लिए एक फ़िल्टर हालत को नामित करने की अनुमति देता है तरीका।

विवरण और तर्क उनकी पोस्ट में हैं, लेकिन कोड अपेक्षाकृत सरल है। इसे लागू करने

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web.Mvc; 

public class ConditionalFilterProvider : IFilterProvider { 
    private readonly 
    IEnumerable<Func<ControllerContext, ActionDescriptor, object>> _conditions; 

    public ConditionalFilterProvider(
    IEnumerable<Func<ControllerContext, ActionDescriptor, object>> conditions) 
    { 

     _conditions = conditions; 
    } 

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

और फिर:: सबसे पहले, फिल्टर प्रदाता बनाने

IEnumerable<Func<ControllerContext, ActionDescriptor, object>> conditions = 
    new Func<ControllerContext, ActionDescriptor, object>[] { 

    (c, a) => c.Controller.GetType() != typeof(HomeController) ? 
     new MyFilter() : null, 
    (c, a) => a.ActionName.StartsWith("About") ? new SomeFilter() : null 
}; 

var provider = new ConditionalFilterProvider(conditions); 
FilterProviders.Providers.Add(provider); 
10

ध्यान दें कि एक नई विशेषता ASP.NET MVC में जोड़ दिया गया है 4.0 कि वास्तव में करता है:
[AllowAnonymous]

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