2009-07-06 9 views
8

मैं एक यूनिट टेस्ट लिखने की कोशिश कर रहा हूं जो मेरे नियंत्रक वर्गों पर सभी क्रिया विधियों के माध्यम से लूप करेगा जो उन तरीकों की तलाश में हैं जिन पर उनके पास कुछ सुरक्षा-संबंधित विशेषता नहीं है (उदा। [प्राधिकृत])।एएसपी.नेट एमवीसी कैसे जानता है कि एक विधि एक क्रिया विधि है?

एएसपी.नेट रूटिंग इंजन कैसे निर्धारित करता है कि कौन सी विधियां क्रिया विधियां हैं? जाहिर है कि कार्रवाई विधियों को सार्वजनिक होना चाहिए, लेकिन ToString() जैसी विधियां क्रिया विधियां नहीं हैं, इसलिए इसमें कुछ तर्क है।

उत्तर

1

मैं आलसी जा रहा है बंद कर दिया और मैं इस सवाल का जवाब, जिनमें से अधिकांश (System.Web.Mvc.ActionMethodSelector.PopulateLookupTables में था) पाया (धन्यवाद परावर्तक!)

private IEnumerable<MethodInfo> GetActionMethods(Type controllerType) 
    { 
     return Array.FindAll(controllerType.GetMethods(BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance), IsValidActionMethod); 
    } 

    private static bool IsValidActionMethod(MethodInfo methodInfo) 
    { 
     return (!methodInfo.IsSpecialName && !methodInfo.GetBaseDefinition().DeclaringType.IsAssignableFrom(typeof(Controller)) && 
      !methodInfo.GetCustomAttributes(typeof(NonActionAttribute), true).Any()); 
    } 

मैं के सभी देख कर हैरान था मेरे आधार नियंत्रक वर्गों पर सार्वजनिक विधियां जिन्हें उन पर कोई सुरक्षा नहीं मिली थी!

+1

यदि आपको नियंत्रक में [प्राधिकरण] फ़िल्टर करने के लिए अपने सभी क्रिया विधियों की आवश्यकता है, तो मुझे पूरा यकीन है कि आप इसे नियंत्रक के शीर्ष पर जोड़ सकते हैं। यह हर क्रिया में जोड़ने के समान प्रभाव है।मुझे विश्वास नहीं है कि यह गैर-क्रिया विधियों को प्रभावित करेगा लेकिन मुझे इसके बारे में गलत हो सकता है। –

8

गैर-सार्वजनिक तरीकों को छोड़कर नियंत्रक में सभी विधियों को क्रियाएं माना जाता है।

सबसे पहले, विधियों का नाम मिलान किया गया है: MethodName = ActionName।

यदि आप डिफ़ॉल्ट व्यवहार को ओवरराइड करना चाहते हैं, तो आप [एक्शननाम] विशेषता का उपयोग करते हैं।

public MyController 
{ 
    [ActionName("ActionY")] 
    public MethodX() 
    { 
    } 
} 

तो इस विधि जब एक http://..../ActionY यूआरएल अनुरोध किया जाता है सक्रिय हो जाएगा।

फिल के ब्लॉग में और अधिक पढ़ें: How a Method Becomes An Action

संपादित करें: ठीक है, हो सकता है यह एक: अपने नियंत्रक वर्ग में सीधे परिभाषित सभी सार्वजनिक विधियों, आधार वर्ग से विरासत में मिला नहीं, आधार वर्ग में उन अधिभावी नहीं, जब तक आप रिकर्सिवली पहचान उन आधार विधियों को पहले से ही क्रियाएं करने के लिए, नोएक्शन विशेषता से सजाया नहीं गया है।

+1

"एक नियंत्रक के सभी तरीकों गैर सरकारी के अलावा क्रिया माना जाता है, तरीकों। " - सच नहीं है, ToString() एक सार्वजनिक विधि है लेकिन एक क्रिया विधि नहीं है। –

+0

इसमें जोड़ने के लिए, यदि आप यूनिट परीक्षण उद्देश्यों के लिए सार्वजनिक होने की आवश्यकता है तो आप सार्वजनिक विधि में एक [NonAction] विशेषता भी जोड़ सकते हैं। –

+0

ठीक है, वह स्पष्ट रूप से नहीं है, लेकिन आपको सामान्य विचार मिला है। आप नियंत्रक वर्ग से प्राप्त होते हैं और आप जो सार्वजनिक विधियां परिभाषित करते हैं, वे आपके कार्य बन जाएंगे। – User

1

एएसपी.नेट एमवीसी पुस्तक में एक्शन विधियों को संसाधित करने के तरीके के बारे में वास्तव में एक अच्छा स्पष्टीकरण है जिसका मैं संदर्भ के लिए उपयोग कर रहा हूं। ऐसा होता है, प्रासंगिक पृष्ठों गूगल बुक्स पर उपलब्ध हैं:

http://books.google.com/books?id=Xb3a1xTSfZgC&lpg=PA308&ots=J9GgXhsads&dq=action%20method%20selection%20sanderson&pg=PA310

मामले में कड़ी मर जाता है, यह स्टीवन सैंडरसन द्वारा प्रो ASP.NET MVC फ्रेमवर्क के पृष्ठ 310 है।

सुनिश्चित नहीं हैं कि यह मदद से आप यह पता लगाने की कैसे अपने इकाई परीक्षण लिखने के लिए है, लेकिन यह मदद कर सकता है आप परावर्तक कोड का पालन करें ...

+0

यह एक अच्छा लेख है! धन्यवाद! –

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