2012-12-20 38 views
38

एक विषय मैं ऑर्चर्ड सीएमएस गैलरी से डाउनलोड पर देख जबकि, मैंने देखा कि एक Layout.cshtml फ़ाइल फ़ाइल के शीर्ष पर कोड के इस खंड के लिए किया था: (एक रेजर फ़ाइल में @ फ़ंक्शन कोड ब्लॉक क्या करता है, और जब (यदि कभी) मुझे इसका उपयोग करना चाहिए?

@functions { 
// To support the layout classifaction below. Implementing as a razor function because we can, could otherwise be a Func<string[], string, string> in the code block following. 
string CalcuClassify(string[] zoneNames, string classNamePrefix) 
{ 
    var zoneCounter = 0; 
    var zoneNumsFilled = string.Join("", zoneNames.Select(zoneName => { ++zoneCounter; return Model[zoneName] != null ? zoneCounter.ToString() : ""; }).ToArray()); 
    return HasText(zoneNumsFilled) ? classNamePrefix + zoneNumsFilled : ""; 
} 
} 

मैं जानता हूँ कि घोषित समारोह क्या करता है गणना करता है कि प्रत्येक कॉलम की चौड़ाई को वापस करने के लिए कौन से जोन आबादी वाले हैं), मेरा प्रश्न है- @ फ़ंक्शन ब्लॉक का सही उपयोग क्या है, और मुझे इसका उपयोग कब करना चाहिए?

+0

व्यक्तिगत रूप से मुझे लगता है कि इसे टालना चाहिए क्योंकि यह आपके द्वारा प्रस्तुतिकरण/दृश्य परत में पानी को गड़बड़ कर देता है और आपका व्यवसाय नियंत्रक/परत क्या है। – Liam

+12

@ लीम - मैं असहमत हूं। मुझे लगता है कि यह स्पष्ट रूप से * पानी के muddying * से बचने के प्रयोजनों के लिए इस्तेमाल किया जाना चाहिए। इस उदाहरण में, यह स्तंभ चौड़ाई निर्धारित करने के प्रयोजनों के लिए है, जो नियंत्रक को कुछ भी पता होना चाहिए। – Bobson

+1

@ बोब्सन पॉइंट – Liam

उत्तर

52

@functions ब्लॉक आपको @Html सहायक में एक्सटेंशन के रूप में जोड़ने या नियंत्रक को प्रदर्शन गुणों के बारे में जानकारी देने के बजाय, उपयोगिता कार्यों को सीधे दृश्य में परिभाषित करने देता है। आप इसका इस्तेमाल करना चाहते हैं जब आप इन शर्तों को पूरा कर सकते हैं:

  1. कार्यक्षमता को देखने के लिए बारीकी से बंधा है और (जैसे कि "कैसे विस्तृत मैं अपने कॉलम बना है") आम तौर पर कहीं और उपयोगी है।
  2. कार्यक्षमता एक साधारण if कथन से अधिक है, और/या आपके दृश्य में कई स्थानों पर उपयोग किया जाता है।
  3. फ़ंक्शन को निर्धारित करने के लिए फ़ंक्शन को यह तर्क देने की आवश्यकता है कि दृश्य के लिए Model में पहले से मौजूद है।

यदि आप पहले को विफल करते हैं, तो इसे @Html सहायक के रूप में जोड़ें।

यदि आप दूसरे को विफल करते हैं, तो बस इसे इनलाइन करें।

यदि आप तीसरे स्थान पर विफल होते हैं, तो आपको अपने नियंत्रक में गणना करना चाहिए और परिणाम को मॉडल के हिस्से के रूप में पास करना चाहिए।

+0

+1 लिया गया। यह एक अच्छा जवाब है। '@ Functions' का उपयोग करने के लिए एक मामला है, लेकिन अक्सर नहीं! –

+1

ग्रेट उत्तर, विशेष रूप से आपके द्वारा उपयोग किए जाने वाले विकल्पों को समझाने के बारे में हिस्सा: डी –

+0

अच्छा जवाब, धन्यवाद –

0

msdn blogs से, @functions ब्लॉक आप पुन: प्रयोज्य कोड लपेट, तरीके और गुण

0

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

यदि आपको ऑर्चर्ड के लिए थीम के लिए कुछ कोड लिखना है, तो आपको एक मॉड्यूल (जैसा कि यहां बताया गया है: http://docs.orchardproject.net/Documentation/Anatomy-of-a-theme) जब तक आप इस कोड को दृश्य में नहीं लिखते हैं।

मुझे यकीन नहीं है कि एक कॉलम के आकार को प्राप्त करने के लिए थीम से मॉड्यूल में स्विच करने का समय उचित है।

6

अन्य ने समझाया है कि @functions ऐसा करता है इसलिए मैं इसे फिर से नहीं दूँगा। लेकिन मैं इसे जोड़ना चाहता हूं:

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

मुझे नहीं लगता कि @functions या @helper का उपयोग करने में कुछ भी गलत है, लेकिन एक बार जब आप अपने विचार में कुछ तरीकों से परे हो जाते हैं, या यहां तक ​​कि यदि फ़ंक्शन कुछ जटिल है, तो यह रिफैक्टरिंग के लायक हो सकता है यदि संभव हो तो viewmodel। यदि यह कोड पुन: उपयोग किया जा सकता है, तो इसे एक सहायक वर्ग में खींचने या HtmlHelper वर्ग के विस्तार के लिए एक अच्छा विचार हो सकता है। एक बात यह है कि एक बमर है, यह आपको महसूस कर रहा है कि आप कोड के एक टुकड़े को फिर से लिखते हैं जो पहले से मौजूद है क्योंकि आप नहीं जानते थे कि यह कुछ मनमानी दृश्य में छिपा हुआ था।