रेजर _layout.cshtml फ़ाइल नाम में एक प्रमुख अंडरस्कोर क्यों है?


144

डिफ़ॉल्ट ASP.NET MVC 3 प्रोजेक्ट में, लेआउट और आंशिक cshtml फाइलें एक अंडरस्कोर के साथ शुरू होती हैं

  • _viewstart
  • _Layout
  • _LogOnPartial

यह सम्मेलन क्यों, और इसके लिए क्या उपयोग किया जाता है? क्या मुझे इस सम्मेलन का पालन करने की आवश्यकता है?

क्या फ्रेमवर्क .cshtmlएक अंडरस्कोर के साथ शुरू होने वाली फ़ाइल को कुछ विशेष अर्थ देता है ?


मैं रेजर के साथ नैन्सीएफएक्स का उपयोग करता हूं और डिफ़ॉल्ट रूप से यह किसी भी सामग्री को प्रतिबंधित करता है जो सामग्री फ़ोल्डर में नहीं है। (इसे web.config या कस्टम कॉन्फिगर में ओवरराइड किया जा सकता है) किसी भी फाइल जैसे कि सीधे .cshtml पर सर्व करना असंभव है। इसलिए मैं अपने दृश्य नामों के लिए "_" का उपयोग नहीं करता क्योंकि यह आवश्यक और बदसूरत नहीं है।
नोर्बर्ट नोबर्टनसन

जवाबों:


205

रेजर ASP.NET वेब पेज (WebMatrix) के लिए विकसित किया गया था, जिसमें व्यू फोल्डर और रूटिंग के संबंध में एक ही तरह की सुरक्षा नहीं है जो आपको MVC के भीतर मिलती है। चूंकि वेब पेजों में लेआउट पृष्ठों को सीधे सेवा देने का इरादा नहीं है, वे अंडरस्कोर के साथ उपसर्ग करते हैं। और वेब पेजों के ढांचे को सीधे उनके अनुरोध के कारण उनके नामों में अग्रणी अंडरस्कोर वाली फ़ाइलों की अनुमति नहीं देने के लिए कॉन्फ़िगर किया गया है। वेब पेजों के भीतर अन्य .cshtml फाइलें आम तौर पर ब्राउज़ करने योग्य होनी चाहिए। वे .asp या .php फ़ाइलों के बराबर होते हैं।

ASP.NET टीम ने कहा है कि ASP.NET विकास के भीतर वेब पेज एक प्रारंभिक बिंदु है, जो समय में MVC के लिए माइग्रेशन का नेतृत्व करना चाहिए (उन लोगों के लिए जो आगे बढ़ना चाहते हैं)। इसका एक भाग का अर्थ है कि वेब पेज से एमवीसी तक प्रवास करना जितना संभव हो उतना आसान होना चाहिए। नतीजतन, यह वेब पेजों के लिए MVC रेजर फ़ाइलों के भीतर स्थापित नामकरण सम्मेलनों को ले जाने के लिए समझ में आता है।

तो वहाँ है एक अंडरस्कोर के साथ फ़ाइल नामों को प्रीफ़िक्स करने एक तकनीकी कारण है - यह सिर्फ MVC के लिए प्रासंगिक नहीं है।

[अद्यतन अक्टूबर 2018]

नए ASP.NET कोर रेजर पेज फ्रेमवर्क (संस्करण 2.1 के अलावा) में, एक प्रमुख अंडरस्कोर के साथ फाइलों को अनदेखा किया जाता है जब मार्ग स्टार्टअप पर उत्पन्न हो रहे हैं - भले ही उनके पास एक @pageनिर्देश हो (जो उन्हें सामान्य रूप से एक रेजर पेज बना देगा) । इसीलिए रेजर पेज एप्लिकेशन में एक प्रमुख अंडरस्कोर के साथ लेआउट और आंशिक फ़ाइलों को नाम देना समझ में आता है, यदि उन्हें ब्राउज करने का इरादा नहीं है।


6
धन्यवाद। मेरे लिए यह सबसे व्यावहारिक जवाब है। मैं इस गलतफहमी में था कि रेजर एमवीसी से बंधा हुआ है। अब मैं देख रहा हूँ कि प्रमुख अंडरस्कोर का कारण उन्हें ASP.NET वेब पेजों के तहत सीधे परोसने से रोकना है।
रिचब

1
एक नामकरण सम्मेलन जिसमें वास्तव में एक कार्यक्षमता बंधी है, मैंने सोचा कि एमएस बेहतर जानता होगा। और अब इसे MVC में ले जाया गया है, जिसे एक साफ स्लेट माना जाता था।
बोरिस बी

उम्मीद है कि वर्तमान .NET फ्रेमवर्क 4.5.1 और विजुअल स्टूडियो 2013 "वन ASP.NET" कार्यक्षमता सहित रिलीज़ होने के बाद वे अंततः इन तकनीकी सीमाओं / हार्ड-कोडिंग से दूर जा सकते हैं। बेशक मानक फ़ाइलें कभी साझा नहीं की गई हैं, जो वर्तमान * .config, APP_Code और APP_Data निर्देशिकाओं की तरह जरूरी है। लेकिन इस तर्क को कहीं एक config फाइल में बैठना चाहिए (मशीन कॉन्फिगर डिफ़ॉल्ट के रूप में) ताकि इसे ओवरराइड किया जा सके। साथ ही आम पन्नों के इन डिफ़ॉल्ट नामों को विन्यास योग्य होना चाहिए (लेआउट / त्रुटि / आदि ...)।
टोनी वॉल

1
@ डैनियल ओह, मैं देख रहा हूं कि आपका क्या मतलब है। मैंने उत्तर को संपादित किया है क्योंकि यह विज्ञापित के रूप में काम नहीं करता है।
माइक ब्रिंड

1
@ डैनियल जो आप देख रहे हैं वह स्पष्ट रूप से एक बग है जो रेजर पेज 2.1 में सामने आया है। इसे 2.2 में तय किया जाना है। यह 2.0 में वर्णित के अनुसार काम करता है।
बजे माइक ब्रिंड

12

यह है कि रूबी ऑन रेल्स कैसे करता है (पार्टिकल्स एक _ से शुरू होता है लेकिन रेंडर आंशिक कॉल में _ शामिल नहीं होता है), और ASP.net MVC ने इससे भारी प्रेरणा प्राप्त की है।

वास्तव में कोई तकनीकी कारण नहीं, सिर्फ एक कन्वेंशन स्पष्ट रूप से अन्य डेवलपर्स (और खुद को 6 महीने बाद) के इरादे को दिखाने के लिए: यह एक आंशिक दृष्टिकोण है।


यह गलत है, जैसा कि ऊपर दिए गए जवाब से बताया गया है - अंडरस्कोर की एक सुरक्षा कार्यक्षमता है।
40 जंगलबॉय

1
@iJungleBoy स्वीकृत उत्तर देखें। ASP.net MVC के लिए (जो कि यह सवाल है), कोई सुरक्षा कार्यक्षमता नहीं है। Web.config को उस दृश्य फ़ोल्डर में देखें जो पहले से ही सभी cshtml और aspx फ़ाइलों को ब्लॉक करता है, अंडरस्कोर करता है या नहीं ( System.Web.HttpNotFoundHandlerउनके लिए सेट करता है)।
माइकल Stum

7

वे पृष्ठ जिन्हें आपके ब्राउज़र (मास्टर पेज, आंशिक विचार आदि) से सीधे अनुरोधों द्वारा नहीं दिखाया जा सकता है, उनके नाम की शुरुआत में अंडरस्कोर (_) है।

इसलिए यदि आप _Layout.cshtml (यह मास्टर पेज है) के लिए अनुरोध करने का प्रयास करते हैं, तो आपको सर्वर से एक त्रुटि मिलेगी।

यह उन फ़ाइलों को अलग करने का एक तरीका है, जिन्हें रेजर व्यू इंजन में, अकेले खड़े पृष्ठों के रूप में ब्राउज़ नहीं किया जा सकता है।

इसे इस तरह से सोचें ... एमवीसी 2 में ... आप आंशिक दृश्य और स्वामी को अलग-अलग करने के लिए अलग करेंगे। मास्टर, .ascx और सामान्य पृष्ठ .aspx, दूसरी ओर, रेजर दृश्य में ... सभी विचार .cshtml हैं, इसलिए आंशिक और मास्टरपीस को भेद करने के लिए उनके पास एक उपसर्ग (_) होगा। यह अनिवार्य नहीं है, सिर्फ एक "सम्मेलन"।


4
लेकिन उस तर्क से सभी cs & cshtml फाइलें एक अंडरस्कोर के साथ उपसर्ग नहीं होगी?
अमीरजहाँ

यदि सभी फ़ाइलों में एक उपसर्ग के रूप में _ होगा तो आपकी साइट काम नहीं करेगी ... जिन फ़ाइलों में _prefix का उपयोग एक सामान्य पृष्ठ के अंदर किया गया है ... (भाग के लिए), और साइटमैप एक टेम्पलेट है ... इसलिए इसमें सामग्री होनी चाहिए प्रदर्शित हों।
जुजटिन

इसलिए मैंने अभी यह कोशिश की है, और मेरे बॉक्स पर IIS दृश्य, निर्देशिका से किसी भी फाइल की सेवा नहीं करता है। स्थिर .html फाइलें भी नहीं। इसलिए मुझे नहीं लगता कि यह उत्तर है।
1

Juztin: सवाल यह है कि वे एक अंडरस्कोर के साथ क्यों शुरू करते हैं? अगर मैं लेआउट का नाम बदल देता हूं। लेआउट के लिए। CCttm। यह अभी भी ठीक काम करता है। तो इस सम्मेलन का कारण क्या है?
रिचब

2
सवाल asp.net mvc के बारे में है, न कि वेबपेजों पर
fabspro

2

जहाँ तक मुझे पता है कि यह केवल एक कन्वेंशन है जिसका उपयोग फ़ाइल के इरादे की पहचान करने के लिए किया जाता है; मुझे विश्वास नहीं है कि यह वास्तव में फ़ाइल के व्यवहार को बदल देगा। अधिकांश विकास के संदर्भों में, एक अंडरस्कोर को प्रस्तुत करना "निजी" उपयोग के लिए होने वाली किसी चीज की पहचान करता है, चाहे एक वर्ग द्वारा, या इस मामले में, कोई अन्य टेम्पलेट।


1

मैं MVC का उपयोग नहीं करता, लेकिन वेब पृष्ठों के साथ जो रेजर सिंटैक्स का भी उपयोग करता है, _ उपसर्ग आमतौर पर यह बताता है कि पृष्ठ का उपयोग उपयोगकर्ता द्वारा नहीं बल्कि अन्य पृष्ठों या कुछ कोड द्वारा किया जाना है। यदि आप किसी ऐसे पृष्ठ पर नेविगेट करने का प्रयास करते हैं जिसमें _prefix शामिल है, तो asp.net उस तक पहुंच को रोक देगा। यही कारण है कि इसका उपयोग लेआउट पृष्ठों और अन्य ऐसे पृष्ठों के साथ किया जाता है क्योंकि उन्हें सीधे उपयोगकर्ता द्वारा एक्सेस नहीं किया जाना चाहिए।

Asp.net में App_Code फ़ोल्डर जैसा कुछ


@ माइकबाइंड आप किसी/view डिफ़ॉल्ट ASP.NET MVC प्रोजेक्ट के तहत किसी भी दृश्य को सीधे 'नेविगेट' नहीं कर सकते / ब्राउज़ नहीं कर सकते हैं ; /views/web.configइसे रोकने के लिए फ़ाइल सेट की गई है। लेकिन नियंत्रक कार्रवाई को वापस लौटने से रोकने के लिए कुछ भी नहीं है View("_Index", model);यह ठीक काम करता है; मैंने सिर्फ एक दृश्य का नाम बदलकर _Index.cshtml किया और मुझे ऊपर बताए अनुसार कॉल करने की क्रिया को बदलना पड़ा।
एंड्रयू बार्बर 13

@ माइकबाइंड यह सवाल एमवीसी के बारे में है, न कि वेब पेजों के बारे में। स्वीकृत; मैंने अपनी मूल टिप्पणी में यह निर्दिष्ट नहीं किया है।
एंड्रयू नाई

@MikeBrind मैं था - और हूँ - इस उत्तर का जवाब। तुम्हारा नहीं। मेरी प्रारंभिक टिप्पणी भ्रामक थी (मैंने "भागमभाग" का भी उल्लेख किया था), हालांकि, मैंने इसे हटा दिया है। मेरा कहना था और यह है कि अंडरस्कोर का MVC में एक दृश्य लोड करने में सक्षम नहीं होने के साथ कुछ नहीं करना है। यह उपयोगकर्ता यह भी कहने लगा, "मैं MVC का उपयोग नहीं करता", फिर भी यह प्रश्न MVC के बारे में था। मैं सिर्फ यह सुनिश्चित कर रहा हूं कि बाद में इस उत्तर को पढ़ने वाला कोई व्यक्ति किसी तरह से यह न सोचें कि एमवीसी में, एक अंडरस्कोर एक दृश्य को लोड करने के लिए नियंत्रक कार्रवाई की क्षमता को प्रभावित करता है। कोई बड़ी बात नहीं। हम सहमत हैं कि मैं किस तरह से बोल रहा था। किया हुआ।
एंड्रयू नाई
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.