_ViewStart.cshtml लेआउट फ़ाइल कहाँ और कैसे जुड़ी है?


199

यहाँ डिफ़ॉल्ट MVC 3 टेम्पलेट से About.cshtml है:

@{
    ViewBag.Title = "About Us";
}

<h2>About</h2>
<p>
     Put content here.
</p>

मुझे उम्मीद है कि _ViewStart फ़ाइल का एक संदर्भ इसमें मिल जाएगा About.cshtml, लेकिन स्पष्ट रूप से यह नहीं है।

मैं में देखा है global.asaxऔर web.config, लेकिन मैं बाहर नहीं मिल सकता है कैसे About.cshtmlफ़ाइल _ViewStart फ़ाइल से लेआउट के साथ "जुड़ा हुआ है"।

सब कुछ उम्मीद के मुताबिक काम करता है, मैं जानना चाहता हूं कि हुड के नीचे क्या हो रहा है ...

जवाबों:


237

से ScottGu के ब्लॉग :

ASP.NET MVC 3 बीटा रिलीज़ के साथ शुरू करते हुए, अब आप अपनी परियोजना के \ Views फ़ोल्डर के नीचे _ViewStart.cshtml (या VB के लिए _ViewStart.vbhtml) नामक एक फ़ाइल जोड़ सकते हैं:

_ViewStart फ़ाइल का उपयोग आम दृश्य कोड को परिभाषित करने के लिए किया जा सकता है जिसे आप प्रत्येक दृश्य के रेंडरिंग के आरंभ में निष्पादित करना चाहते हैं। उदाहरण के लिए, हम अपने _ViewStart.cshtml फ़ाइल के भीतर कोड को प्रोग्रामेटिक रूप से प्रत्येक के लिए लेआउट प्रॉपर्टी को सेट करने के लिए लिख सकते हैं साइट डिफ़ॉल्ट रूप से SiteLayout.cshtml फ़ाइल हो:

क्योंकि यह कोड प्रत्येक दृश्य के प्रारंभ में निष्पादित होता है, हमें अब लेआउट को स्पष्ट रूप से हमारी किसी भी व्यक्तिगत फाइल में सेट करने की आवश्यकता नहीं है (सिवाय इसके कि हम डिफ़ॉल्ट मान को ओवरराइड करना चाहते हैं)।

महत्वपूर्ण: क्योंकि _ViewStart.cshtml हमें कोड लिखने की अनुमति देता है, हम वैकल्पिक रूप से हमारे लेआउट चयन तर्क को केवल एक मूल संपत्ति सेट से अधिक समृद्ध बना सकते हैं। उदाहरण के लिए: हम उस लेआउट टेम्प्लेट को अलग-अलग कर सकते हैं जिसका उपयोग हम इस आधार पर करते हैं कि साइट किस प्रकार के उपकरण का उपयोग कर रही है - और उन उपकरणों के लिए एक फ़ोन या टैबलेट अनुकूलित लेआउट और पीसी / लैपटॉप के लिए एक डेस्कटॉप अनुकूलित लेआउट है। या यदि हम एक CMS सिस्टम या सामान्य साझा ऐप बना रहे थे, जिसका उपयोग कई ग्राहकों के लिए किया जाता है, तो हम साइट पर पहुँचते समय ग्राहक (या उनकी भूमिका) के आधार पर अलग-अलग लेआउट का उपयोग कर सकते हैं।

यह बहुत सारे UI लचीलेपन को सक्षम करता है। यह आपको एक बार में अधिक आसानी से व्यू लॉजिक लिखने की अनुमति देता है, और इसे कई स्थानों पर दोहराने से बचता है।

यह भी देखें इस


14
तो यह MVC3 की "हार्डकोड" सुविधा से कम या ज्यादा है? मुझे इसे किसी अन्य "डिफ़ॉल्ट" पृष्ठ पर बदलने की कोई आवश्यकता नहीं है, बस उत्सुक था कि इसे कैसे स्थापित किया गया था। यह सब छांटने के लिए धन्यवाद :)
Kman

2
केमन- हार्डकॉन्टेड, कन्वेंशन द्वारा (दूसरा 'हैंडल' यहां चुनें :)) - हां, बिल्कुल। खुशी है कि इसने कोहरे
जीम टोलन

यह आपके "दृश्य" फ़ोल्डर में नहीं है जिसे आपको इसकी आवश्यकता हो सकती है। यदि आप अन्य फ़ोल्डरों में विचारों को व्यवस्थित करने के लिए एक कस्टम रेज़र व्यूइंगइन जोड़ते हैं, तो आपको फ़ाइल को उन वैकल्पिक दृश्य फ़ोल्डरों की जड़ में भी शामिल करना होगा। उदाहरण के लिए, मैंने सभी इंस्पिनिया टेम्प्लेट दृश्यों को एक फ़ोल्डर में स्थानांतरित किया और इसे व्यू इंजन में चलाया ViewLocationFormats = ViewLocationFormats.Union(new string[] { "~/Inspinia/ExampleViews/{1}/{0}.cshtml" }).ToArray();। नतीजतन, मुझे अपनी _ViewStart.cshtml फ़ाइल की एक प्रति "~ / Inspinia / ExampleViews" में डालनी थी, अन्यथा इसे नहीं उठाया गया था और कोई लेआउट सेट नहीं किया गया था।
त्रिवेंको

2
यदि आपके दृश्य फ़ोल्डर में सबफ़ोल्डर हैं, तो क्या आप _ViewStartप्रत्येक सबफ़ोल्डर में एक डाल सकते हैं जो उस सबफ़ोल्डर के विचारों से लिंक होगा?
टोडरमो

35

अधिक सामान्य अर्थ में MVC फ्रेमवर्क की इस क्षमता को _Viewstart.cshtml के बारे में "जानना" कहा जाता है, " कॉन्कोडिंग द्वारा कोडिंग"।

कॉन्फ़िगरेशन पर कन्वेंशन (जिसे कन्वेंशन द्वारा कोडिंग के रूप में भी जाना जाता है) एक सॉफ्टवेयर डिज़ाइन प्रतिमान है जो डेवलपर्स द्वारा किए जाने वाले निर्णयों की संख्या को कम करने का प्रयास करता है, जिन्हें सादगी प्राप्त करना आवश्यक है, लेकिन जरूरी नहीं कि लचीलापन खोना। वाक्यांश का अनिवार्य रूप से मतलब है कि एक डेवलपर को केवल आवेदन के अपरंपरागत पहलुओं को निर्दिष्ट करने की आवश्यकता है। उदाहरण के लिए, यदि मॉडल में एक वर्ग बिक्री है, तो डेटाबेस में संबंधित तालिका को डिफ़ॉल्ट रूप से "बिक्री" कहा जाता है। यह केवल तभी होता है जब कोई इस सम्मेलन से हटता है, जैसे कि टेबल को "products_sold" कहना, इन नामों के संबंध में कोड लिखना होगा।

विकिपीडिया

इसमें कोई जादू नहीं है। इसका सिर्फ MVC फ्रेमवर्क के मुख्य कोडबेस में लिखा गया है और इसलिए कुछ ऐसा है जिसके बारे में MVC "जानता" है। यही कारण है कि आप इसे .config फ़ाइलों या अन्य जगहों पर नहीं पाते हैं; यह वास्तव में MVC कोड में है। हालाँकि आप इन सम्मेलनों को बदल सकते हैं या उन्हें रद्द कर सकते हैं।


13
यदि एमवीसी इसके बारे में जानता है, तो विज़ुअल स्टूडियो को क्यों नहीं पता है और यह मुझे इंगित करता है? यदि कन्वेंशन द्वारा कोडिंग का मतलब है कि सामान तब तक काम करता है जब तक आप इस कन्वेंशन को तोड़ने के लिए इसे नहीं चूसते हैं ...
Arne Evertsson

सम्मेलन को न तोड़ना एक तरह की बात है। रेल पर AKAIK रूबी भी इस प्रतिमान का अनुसरण करता है।
उमर फारूक ख्वाजा

+1 रायफ। खराब दस्तावेज "सम्मेलन द्वारा कोडिंग" का बचाव करने का कोई मतलब नहीं है। मैं कह सकता हूं कि मेरे किसी भी बैकवर्ड कोड के बारे में। "क्या? आप यह उम्मीद नहीं करते थे कि जब यह 33 को हो जाए तो दुर्घटना हो सकती है? हर कोई जानता है कि आप 33 को छोड़ देंगे।" दुर्भाग्य से, ASP.NET MVC के लिए प्रलेखन अंतर बहुत बड़ा है। केवल एमएस डॉक्स ऑटो-जेनरेट होते हैं, जिनमें कोई आंतरिक स्रोत सारांश नहीं होता है।
शैनन

6
कॉन्फ़िगरेशन पर कन्वेंशन का मतलब यह नहीं है कि आप इसे बदल नहीं सकते। वहाँ उस फ़ाइल का नाम और स्थान निर्दिष्ट करने में सक्षम होने के लिए उपलब्ध होना चाहिए विन्यास। बहुत अच्छी तरह से हो सकता है, लेकिन कौन जानता है कि यह क्या है। लोग "कॉन्फिगरेशन ओवर कॉन्फिगरेशन" मंत्र का उपयोग कोडबेस में खराब निर्णयों की एक भीड़ को कवर करने के लिए करते हैं और इसने मुझे उस व्यक्ति के रूप में पेशाब कर दिया जो अपने खराब-दस्तावेज की गड़बड़ी को बनाए रखने के लिए साथ-साथ आता है, जो "काम करता है" (लेकिन भगवान-आप कुछ भी बदलें - आप घंटों बिताएंगे कि आपने कैसे सब कुछ तोड़ दिया)।
रॉबर्ट सी। बर्थ

3
@AidenStrydom मैं असहमत हूं। स्वीकृत उत्तर वास्तव में मुझे बताता है कि _ViewStart का उपयोग कैसे करें। यह उत्तर केवल एक डिजाइन अवधारणा के बारे में बात करता है। मैं _ViewStart के बारे में जानकारी के लिए यहाँ आया था, इस बारे में जानकारी नहीं कि Visual Studio मुझे _ViewStart के बारे में कुछ क्यों नहीं बताएगा।
मिल्ली स्मिथ

23

बस दूसरे ने सोचा।

यदि आप अपनी cshtmlफ़ाइल को एक सामान्य टेम्पलेट के रूप में रखना चाहते हैं , तो आप इसे इस तरह से कर सकते हैं

अपने भीतर _viewstart.cshtmlआप अपनी आम cshtmlफाइल का उल्लेख कर सकते हैं ।

@{Layout = "~/Views/Shared/_Layout.cshtml";}

14

स्रोत कोड प्रलेखन की तुलना में इसके लिए देखने के लिए एक बेहतर जगह है।

जीवीबी से एमवीसी 6 कोड का संदर्भ देते हुए, हमारे पास ब्याज की कुछ फाइलें हैं

----अपडेट करें----

स्रोत संरचना परिवर्तन के कारण, व्यूस्टार्ट पृष्ठ कैसे एकत्रित किए जाते हैं, इसकी जानकारी अब RazorViewEngine.cs में "GetViewStartPages" फ़ंक्शन के लिए देखी जा सकती है ।

----/अपडेट करें----

जवाब देने के लिए कि वे खेल में कैसे आते हैं, रेजरव्यू को देखें , जो मुझे विश्वास है (आईवीईवाई के कारण) एमवीसी पाइपलाइन से बंधा हुआ है। इस फ़ाइल में एक RenderAsync विधि है जिसे अनुरोधित दृश्य को प्रस्तुत करने के लिए MVC पाइपलाइन से कॉल किया जाता है।

RenderAsync RenderPage और THEN RenderLayout को कॉल करता है (ध्यान दें)। RenderPage पहले viewstart फ़ाइलों से निपटने के लिए कॉल करता है (बहुवचन पर ध्यान दें, एक से अधिक _viewstart फ़ाइल हो सकती है)।

इसलिए, आप जो जानकारी चाहते हैं, उसे Microsoft.AspNet.Mvc.Razor नाम स्थान के तहत RazorView.cs फ़ाइल में RenderViewStartAsync फ़ंक्शन से प्राप्त किया जा सकता है ।


7

यह इस प्रश्न के लिए कुछ addt'l जानकारी अब जोड़ सकता है (2016 ala MVC4, MVC5)।

रेजर इंजन किसी अन्य कोड से पहले _ViewStart.cshtml में कोड ढूंढता है और चलाता है जो उसी निर्देशिका या उपनिर्देशिका में है जहां _ViewStart.cshtml पाया जाता है।

कोई भी दृश्य लेआउट संपत्ति या उसके किसी भी मान को ओवरराइड कर सकता है ।

बस मैंने सोचा कि मैं आपको दिखाने के लिए थोड़ा और जानकारी जोड़ सकता हूं कि यह _ViewStart क्यों है।

यदि आप ILSpy प्राप्त करते हैं और RazorViewEngine (System.Web.Mvc.dll) में कोड की जांच करते हैं, तो आप देखेंगे कि कोड स्वयं उस नाम का संदर्भ देता है।

_ViewStart System.Web.Mvc.dll में

आप देख सकते हैं कि RazorViewEngine उस नाम के साथ एक फ़ाइल की तलाश में है:

razorviewengine कोड

RazorViewEngine.ViewStartFileName = "_ViewStart";

3
इस के लिए मैं क्या देख रहा था, मुझे नफरत है "पता नहीं है" क्या, अपने प्रोजेक्ट में चल रही है क्योंकि मैं भी वी.एस. के लिए अपने खुद के टेम्पलेट्स और इस फाइल को कर रहा हूँ कि सिर्फ बाहर आने हवा से बहुत समझने के लिए असुविधाजनक था
सेबस्टियन 506,563

1

यदि आप अपने पृष्ठों के लिए एक सामान्य लेआउट रखना चाहते हैं, तो आपको सामान्य लेआउट को परिभाषित करने की आवश्यकता है और लेआउट के साथ एक दृश्य को जोड़ने के लिए हमें प्रत्येक और हर दृश्य पर लेआउट गुण सेट करना होगा, यह DRY (अपने आप को दोहराएं) सिद्धांत का उल्लंघन नहीं करता है। इसके लिए .Net फ्रेमवर्क ने "_ViewStart.cshtml" फाइल प्रदान की है, जिसे व्यू फोल्डर के अंदर रखा गया है। हम "_ViewStart.cshtml" फ़ाइल में लेआउट जानकारी रखते हैं और डिफ़ॉल्ट रूप से प्रत्येक दृश्य इस लेआउट जानकारी का उपयोग करता है। यदि आप कुछ अलग लेआउट की जानकारी देना चाहते हैं, तो अपने होम व्यू को मान लें, आप उस लेआउट के संदर्भ में एक नया "_ViewStart.cshtml" बना सकते हैं और इसे "होम व्यू" फ़ोल्डर में रख सकते हैं।


1

संक्षिप्त उत्तर है : ViewStarts पहले शुरू होता है जब कोई भी दृश्य प्रदान किया जा रहा है। नीचे दी गई लंबी कहानी है:

एकल दृश्य फ़ाइल के निर्माण की कहानी:

  1. ViewStart ViewImports के साथ विलय कर दिया गया है और फिर एक फ़ाइल के रूप में निष्पादित किया गया है। ध्यान दें कि ViewImports हमेशा ViewStart फ़ाइल सहित किसी भी cshtml फ़ाइल के साथ मर्ज किया जाता है। इसका उद्देश्य @ मनोरंजक बयानों और अन्य सामान्य निर्देशों का सार है।
  2. ViewStart (जैसे लेआउट और ViewData) का आउटपुट विशिष्ट व्यू फ़ाइल के लिए उपलब्ध हो जाता है।
  3. व्यू फ़ाइल के अंदर, यदि लेआउट वैरिएबल / शून्य है, तो दृश्य का मुख्य भाग प्रदान किया जाता है और अंतिम आउटपुट उपयोगकर्ता को दिया जाता है।
  4. यदि लेआउट चर / शून्य नहीं है, तो निष्पादन को लेआउट फ़ाइल में ले जाया जाता है, जो बदले में ViewImports के साथ एक फ़ाइल के रूप में विलय कर दिया जाता है और फिर लेआउट फ़ाइल निष्पादन के अंदर @RenderBody () स्टेटमेंट पर दृश्य फ़ाइल में वापस ले जाया जाता है जो ViewImports के साथ फिर से विलय हो जाता है और आउटपुट @RenderBody () के स्थान पर लेआउट फ़ाइल के साथ विलय कर दिया जाता है और अंतिम आउटपुट उपयोगकर्ता को दिया जाता है।

आशा है कि यह आपको इस बात से अवगत कराता है कि वास्तव में आपके कार्यक्रम के जीवन चक्र के अज्ञात रहस्यों के अंदर क्या हो रहा है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.