2012-07-02 17 views
12

मैं नियंत्रक के सभी कार्यों की सूची कैसे प्राप्त कर सकता हूं? मैं खोज करता हूं लेकिन उदाहरण/उत्तर नहीं ढूंढ सकता। मैं प्रतिबिंब का उपयोग करके अनुशंसित कुछ उदाहरण देखता हूं लेकिन मुझे नहीं पता कि कैसे। जाहिर हैनियंत्रक नाम पास करके एमवीसी नियंत्रक के सभी कार्यों की सूची कैसे प्राप्त कर सकता हूं?

public List<string> ActionNames(string controllerName) 
{ 
    var types = 
     from a in AppDomain.CurrentDomain.GetAssemblies() 
     from t in a.GetTypes() 
     where typeof(IController).IsAssignableFrom(t) && 
       string.Equals(controllerName + "Controller", t.Name, StringComparison.OrdinalIgnoreCase) 
     select t; 

    var controllerType = types.FirstOrDefault(); 

    if (controllerType == null) 
    { 
     return Enumerable.Empty<string>().ToList(); 
    } 
    return new ReflectedControllerDescriptor(controllerType) 
     .GetCanonicalActions().Select(x => x.ActionName) 
     .ToList(); 
} 

के रूप में हम प्रतिबिंब पता: प्रतिबिंब का उपयोग करना है

public List<string> ActionNames(string controllerName){ 




} 
+0

मैं यहां एक टिप्पणी करने जा रहा हूं, क्योंकि यह सामान्य है। जो आप करने की कोशिश कर रहे हैं उसके लिए (नियंत्रक कार्रवाई नाम) ऐसा नहीं है कि इसे किया जाना चाहिए। एक ही नाम के साथ कई क्रियाएं हो सकती हैं और कुछ अजाक्स केवल इत्यादि हो सकती हैं। आपकी अनुमतियां नियंत्रक कार्यों की तुलना में अन्य चीजों पर आधारित होनी चाहिए। –

उत्तर

21

आप हमें नहीं बताया है तुम क्यों लेकिन एक संभावना यह की जरूरत है:

यहाँ मैं क्या करने की कोशिश कर रहा हूँ बहुत तेज़ नहीं है इसलिए यदि आप इस विधि को अक्सर कॉल करना चाहते हैं तो आप इसे हर बार लाने और memoizing दिए गए इनपुट पैरामीटर के लिए विधि से बचने के लिए नियंत्रकों की सूची को कैश करके इसे बेहतर बनाने पर विचार कर सकते हैं।

+0

धन्यवाद !!! मेरे आवेदन में, मुझे व्यवस्थापक उपयोगकर्ता के लिए अनुमति पृष्ठ बनाना होगा। व्यवस्थापक ड्रॉपडाउन सूची से नियंत्रक नाम का चयन करेगा, फिर एक्शनलिस्ट चयनित नियंत्रक नाम के आधार पर गतिशील रूप से प्रदर्शित होगी। फिर उन मूल्यों को उपयोगकर्ताओं/भूमिकाओं को असाइन करें। – nannypooh

+0

मुझे "टी टी ए। गेट टाइप्स() से त्रुटि मिली - अनुरोधित प्रकारों में से एक या अधिक लोड करने में असमर्थ।" – nannypooh

+0

यह इंगित करने योग्य है कि प्रतिबिंबित नियंत्रक डिस्क्रिप्टर की GetCanonicalActions विधि नियंत्रक पर प्रत्येक सार्वजनिक विधि के लिए एक एक्शनडिस्क्रिप्टर लौटाएगी, जिसमें विधियां नहीं हैं। यह NonActionAttribute को भी अनदेखा करता है। – rossisdead

0

डारिन के उत्तर में थोड़ा सा झटका। कोड कोड के साथ काम करने के लिए मुझे इस बदलाव की आवश्यकता थी क्योंकि यह एक अलग असेंबली के तहत चलता है।

public static List<string> GetAllActionNames(string controllerName) 
{ 
    var controllerType = Assembly.Load("YourAssemblyNameHere") 
     .GetTypes() 
     .FirstOrDefault(x => typeof(IController).IsAssignableFrom(x) 
      && x.Name.Equals(controllerName + "Controller", StringComparison.OrdinalIgnoreCase)); 

    if (controllerType == null) 
    { 
     return Enumerable.Empty<string>().ToList(); 
    } 
    return new ReflectedControllerDescriptor(controllerType) 
     .GetCanonicalActions().Select(x => x.ActionName) 
     .ToList(); 
}