समान लेआउट का उपयोग करने के लिए सभी क्षेत्रों को बाध्य करें


87

मेरे पास निम्नलिखित परियोजना संरचना है:

  • / दृश्य / साझा / _Layout;

  • / क्षेत्रों / Area1 / दृश्य / ControllerName / सूचकांक;

...

  • / क्षेत्रों / AreaN / दृश्य / ControllerName / सूचकांक।

क्या सभी क्षेत्रों को आधार लेआउट के रूप में _Layout का उपयोग करने के लिए बाध्य करने का कोई तरीका है ?

क्या _ViewStart फ़ाइल (उदाहरण के लिए, रूटिंग कॉन्फ़िगरेशन के माध्यम से) को जोड़े बिना ऐसा करने का कोई तरीका है ?

यह सभी देखें:

मैं ASP.NET MVC 3 रेजर ViewStart फ़ाइल में विभिन्न लेआउट कैसे निर्दिष्ट करूं?


जवाबों:


154

आपको बस नाम की एक फ़ाइल जोड़ना है:

_ViewStart.cshtml

प्रत्येक क्षेत्र दृश्य फ़ोल्डर के तहत:

/Areas/Area1/Views/_ViewStart.cshtml

और इस तरह रूट लेआउट को इंगित करने के लिए फ़ाइल को संपादित करें:

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

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

नोट: जैसा कि टोनी ने उल्लेख किया है, आप रूट लेआउट को इंगित करने के लिए प्रत्येक दृश्य की लेआउट संपत्ति को संपादित कर सकते हैं, हालांकि यह ऐसा करने के लिए अनुशंसित तरीका नहीं है क्योंकि आप अपने लेआउट के साथ अपने विचारों को युग्मित करेंगे और इसे बदलना दर्दनाक होगा।

संपादित करें 1

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

कस्टम RazorViewEngineऔर के बारे में Google के लिए प्रयास करेंRazorView

यह लेख एक अच्छी शुरुआत हो सकती है

http://weblogs.asp.net/imranbaloch/archive/2011/06/27/view-engine-with-dynamic-view-location.aspx

मैंने ऐसा कुछ नहीं किया है लेकिन मुझे उम्मीद है कि मैं आपको सही दिशा में इशारा कर रहा हूं


1
क्या "_ViewStart" फ़ाइल को जोड़ने के बिना इसे करने का कोई तरीका है (उदाहरण के लिए, रूटिंग कॉन्फ़िगरेशन के माध्यम से)?
मिखाइल

2
रूटिंग के भीतर मुझे ऐसा नहीं लगता। वे दो अलग चीजें हैं। रूटिंग चार्ज करने के लिए रूटेज़टेबल में पंजीकृत मार्ग के साथ वर्तमान अनुरोध URL से मिलान करने का प्रयास करता है, जब एक मैच पाया जाता है, एक IMvcRouteHandler बनाया जाता है और फिर एक IHttpHandler (MvcHandler) आपके नियंत्रक की कार्रवाई को संसाधित करने के लिए प्रभारी होता है। जैसा कि आप देख सकते हैं, इसका न तो विचारों से कोई लेना-देना है और न ही लेआउट से। ऐसा इसलिए है क्योंकि कोई रूट आवश्यक रूप से दृश्य नहीं देता है, यह json या xml लौटा सकता है। तो इस तरह से कुछ को लागू करने के लिए रूटिंग सही जगह नहीं है।
जुपॉल

आप इसे _ViewStartसीधे सभी क्षेत्रों में लागू करने के लिए सीधे एरिया फ़ोल्डर में भी जोड़ सकते हैं।
आर्टुर

21

जपोल द्वारा उत्तर पर विस्तार…।

कम से कम VS2013 में, क्षेत्र बनाते समय डिफ़ॉल्ट रूप से _ViewStart.cshtml फ़ाइल जोड़ी जाती है, इसलिए यह पहले से ही है, और आप सामग्री को बदल सकते हैं क्योंकि वह रूट _Layout.cshtml को इंगित करता है। आप उस क्षेत्र में _Layout.cshtml को हटा सकते हैं, क्योंकि इसका अब उपयोग नहीं किया जाता है (और भ्रम का संभावित स्रोत)

हालाँकि, ऐसा करने से उस रूट में निष्पादित किसी भी मार्ग _Layout.cshtml को क्षेत्रों पर विचार करना होगा।
डिफ़ॉल्ट _Layout.cshtml में कई एक्शनलिंक मददगार होते हैं जिन्हें थोड़ा सा संशोधन करने की आवश्यकता होती है:

Area = "" सेट करके किसी भी ActionLink कॉल के लिए रूटवैल्यूडैम परम जोड़ें। ध्यान दें कि खाली स्ट्रिंग रूट स्तर को संदर्भित करता है। यह इन लिंक को एक क्षेत्र के भीतर से आह्वान करने पर सही ढंग से काम करने की अनुमति देगा, फिर भी जड़ से मंगाने पर काम करेगा।

उदाहरण के लिए:

<li>@Html.ActionLink("Home", "Index", "Home", new { Area = "" }, null)</li>

2

आप एक लेआउट निर्दिष्ट करते हैं:

@ {लेआउट = "_Layout"; }

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

निश्चित नहीं है कि रूटिंग को बदलने की आवश्यकता होगी या शायद मुझे समझ में नहीं आ रहा है। उम्मीद है की यह मदद करेगा :)

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