रेजर लेआउट के बिना देखें


81

जब मैं Layout = null;अपने विचार में आता हूं तो कैसे आता है - यह अभी भी डिफ़ॉल्ट लेआउट में खींचता है ?!

क्या ऐसा करने से रोकने के लिए कोई चाल है?

यहाँ लेआउट के बिना मेरा विचार है:

@{
    Layout = "";
}

<!DOCTYPE html>

<html>
<head>
    <title>Index</title>
    @{Html.RenderAction("Head", "Header");}
</head>
<body>
    <div>
        Home
    </div>
</body>
</html>

यहाँ प्रस्तुत आउटपुट है !!

<!DOCTYPE html>

<html>
<head>
    <title>Index</title>
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
    <link href="/Content/Site.css" rel="stylesheet" type="text/css" />
    <script src="/Scripts/jquery-1.5.1.min.js" type="text/javascript"></script>
    <script src="/Scripts/modernizr-1.7.min.js" type="text/javascript"></script>
</head>

<body>
    header
</body>
</html>
</head>
<body>
    <div>
        Home
    </div>
</body>
</html>

क्या आप दिए गए nullपेज में शब्द देखते हैं ?
SLaks

आप डिफ़ॉल्ट लेआउट कहाँ स्थापित कर रहे हैं?
SLaks

क्या आपके पास इस निर्देशिका में _viewstart.cshtml है? जब आप _viewstart का उपयोग करने की कोशिश कर रहे थे तो मुझे वही समस्या थी। तब मैंने इसका नाम बदलकर _mydefaultview कर दिया, इसे दृश्य / साझा निर्देशिका में स्थानांतरित कर दिया, और cshtml फ़ाइलों में कोई भी दृश्य निर्दिष्ट नहीं करने के लिए स्विच किया, जहाँ मैं यह नहीं चाहता, और बाकी के लिए _mydefaultview निर्दिष्ट करता हूं। पता नहीं क्यों यह आवश्यक था, लेकिन यह काम किया।
DMulligan

कृपया इसे उत्तर के रूप में सेट करें और मैं इसे सही चिह्नित करूंगा यह निश्चित रूप से रेजर में एक बग होना चाहिए?

मुझे यकीन नहीं है कि अगर यह एक बग है, तो _viewstarts को अधिलेखित नहीं करने का इरादा है, या अगर हमने कुछ गलत किया है। मैं भी जानना चाहूंगा।
DMulligan

जवाबों:


14

क्या आपके पास _ViewStart.cshtmlइस निर्देशिका में है? जब आप _ViewStart का उपयोग करने की कोशिश कर रहे थे तो मुझे वही समस्या थी। तब मैंने इसका नाम बदलकर _mydefaultview कर दिया, इसे Views/Sharedनिर्देशिका में स्थानांतरित कर दिया, और cshtml फ़ाइलों में कोई दृश्य निर्दिष्ट नहीं करने के लिए स्विच किया, जहाँ मैं यह नहीं चाहता, और बाकी के लिए _mydefaultview निर्दिष्ट करता हूँ। पता नहीं क्यों यह आवश्यक था, लेकिन यह काम किया।


यह अजीब लगता है। _ViewStart, ध्यान में रखते हुए कोड से पहले चलाना चाहिए ताकि इस मुद्दे नहीं होना चाहिए। क्या आपके पास अपने _ViewStart में कुछ भी असामान्य है?
SLaks

@ SLaks made मैंने एक _viewstart बनाया है जिसमें परीक्षण करने के लिए "हैलो वर्ल्ड" है, और हैलो वर्ल्ड अभी भी दिखाता है अगर मैं लेआउट = अशक्त निर्दिष्ट करता हूं। हालांकि, अगर मैं लेआउट के रूप में _mydefaultview निर्दिष्ट करता हूं तो वह भी दिखाता है। "हेल्लो वर्ल्ड" में inbetween टैग दिखाई दे रहा है जहाँ मेरे पास @RenderBody () _mydefaultview है।
DMulligan

4
तुम गलत समझ रहे हो _ViewStart। मेरा जवाब देखिए।
एसएलकेएस

162

मुझे लगता है यह :

@{
    Layout = "";
 }

यह इस तरह नहीं है:

@{
    Layout = null;
 }

मैं दूसरे का उपयोग करता हूं और यह काम कर रहा है, कोई _Viewstart शामिल नहीं है।


4
इस प्रश्न का सही उत्तर कैसे नहीं है?
पिंस्की

1
उत्तरार्द्ध मेरे लिए काम करता था और पहली चीज थी जो दिमाग में आई थी।
Stonetip

@ पिंस्की शायद इसलिए क्योंकि इसे 2 साल बाद जोड़ा गया था। :)
वाइल्डजॉ

35

आप (केमुल्लिगन) गलतफहमी वाले _ViewStartपृष्ठ हैं।

_ViewStartआपके पृष्ठ के प्रारंभ होने से पहले हमेशा निष्पादित होगा ।
यह गुणों को इनिशियलाइज़ करने के लिए उपयोग किया जाता है (जैसे कि Layout); आम तौर पर इसमें मार्कअप नहीं होना चाहिए। (चूंकि इसे ओवरराइड करने का कोई तरीका नहीं है)।

सही पैटर्न एक अलग लेआउट पेज बनाना है जो कॉल करता है RenderBody, और Layoutइस पेज को इंगित करने के लिए संपत्ति सेट करता है_ViewStart

फिर आप Layoutअपने सामग्री पृष्ठों में बदल सकते हैं , और परिवर्तन प्रभावी होंगे।


अच्छी तरह से मेरे _Layout.cshtmlसभी बुनियादी डिजाइन शामिल हैं। और _ViewStart.cshtmlकॉल करता है _Layout.cshtml। मेरे ऐप के प्रत्येक मॉड्यूल का अपना लेआउट पृष्ठ है लेकिन वे लेआउट मुख्य का उपयोग करते हैं _Layout.cshtml। जैसा कि mvc app viewstart से शुरू होता है, मुझे लगता है कि मेरा एकमात्र समाधान viewstart के अंदर सब कुछ टिप्पणी करना था। और इससे कोई अतिरिक्त समस्या नहीं होती है क्योंकि अन्य पृष्ठ पहले से ही उपयोग कर रहे थे _Layout.cshtml। बहुत साधारण।
वाहिद मसूद

23

मुझे लगता है कि यह व्यक्तिगत "विचारों" के साथ बेहतर काम है, Im PHP से MVC4 में जाने की कोशिश कर रहा है, यह वास्तव में कठिन है, लेकिन दाईं ओर im है ...

अपने प्रश्न का उत्तर देते हुए, यदि आप अलग-अलग पृष्ठों पर काम करेंगे, तो बस _ViewStart.cshtml संपादित करें

@{
  Layout = null;
}

एक और टिप अगर आपको सीएसएस पथ के साथ कुछ समस्याएं मिल रही हैं ...

Url से पहले "../" लगाएं

यह 2 समस्याएं हैं जो मुझे आज मिलती हैं, और मैं उस तरह से हल करता हूं!

सादर;


21

अगर कोई दृश्य लेआउट का उपयोग करना चाहिए या नहीं, यह निर्धारित करने के लिए तर्क नहीं होना चाहिए _viewStartऔर न ही View। डिफ़ॉल्ट में सेट करना _viewStartठीक है, लेकिन दृश्य / व्यूस्टार्ट में किसी भी लेआउट तर्क को जोड़ने से उस दृश्य को कहीं और (या लेआउट के साथ) उपयोग करने से रोकता है।

आपकी नियंत्रक कार्रवाई होनी चाहिए:

return PartialView()

इस प्रकार के तर्क को व्यू में डालकर आप M (डेटा), V (विजुअल), C (तर्क) में सिंगल जिम्मेदारी सिद्धांत नियम को तोड़ रहे हैं ।


यह स्कॉट गु के विपरीत है जो यहां weblogs.asp.net/scottgu/asp-net-mvc-3-layouts कहता है । we could write code within our _ViewStart.cshtml file to programmatically set the Layout property for each View ... we could vary the Layout template that we use depending on what type of device is accessing the site – and have a phone or tablet optimized layout for those devicesवह लेआउट को स्विच करने के लिए तर्क का उपयोग करने के लिए एक जगह के रूप में स्पष्ट रूप से _viewstart को बढ़ावा दे रहा है (नियंत्रकों और कार्रवाई फिल्टर का भी उल्लेख करता है)। इसलिए यह निरपेक्षता की तुलना में अधिक प्राथमिकता की बात है: जहां लेआउट को बदलना है।
2:15 बजे रिस्म

मेरी प्राथमिकता डिजाइन पैटर्न से चिपके रहना है। आप अपने दृष्टिकोण में डेटाबेस का उपयोग फेंक सकते हैं, यह भी बुरा अभ्यास या "वरीयता का मामला" है।
एरिक फिलिप्स

यह एक काफी हाइपरबोलिक प्रतिक्रिया है जैसा कि कथन "व्यू / व्यूस्टार्ट में किसी भी लेआउट तर्क को जोड़ने से उस दृश्य को कहीं और उपयोग करने से रोकता है"। यह पूरी तरह से प्रश्न में आवेदन पर निर्भर करता है। ऐसे अनगिनत उदाहरण हैं जिनमें दिए गए दृश्य की लेआउट (मास्टर) फ़ाइल पर कोई निर्भरता नहीं है। मास्टर बस कुछ ब्रांडिंग या नौसेना के लिए है और हम जो भी करना चाहते हैं, वह मोबाइल और डेस्कटॉप लेआउट के बीच स्विच करना है (द्रव लेआउट एक तरफ)। एक यह भी तर्क दे सकता है कि आप वास्तव में इस संदर्भ में लेआउट को बदलने के लिए एक नियंत्रक भी बनाकर एसआरपी को तोड़ सकते हैं।
रास

मैं आपके अंतिम वक्तव्य पर आपकी बात नहीं देखता। दृश्य डेटा की प्रस्तुति है। उस दृश्य में किसी भी तर्क का अर्थ यह नहीं है कि इसका उपयोग कहां किया जा सकता है और उस तर्क के परीक्षण को रोकता है जो सामान्य रूप से नियंत्रक में होता है। कंट्रोलर के पास सही प्रेजेंटेशन को निर्धारित करने के लिए MVC ( IsAjaxRequest या ChildActionOnly ) में लॉजिक पहले से ही है ।
एरिक फिलिप्स

1
यहां हम _ViewStart के बारे में बात कर रहे हैं जो ViewResult विशिष्ट हैं। तो .. may or may not (JSON/XML) not even be Html rendered by a View Engineकोई असर नहीं है। A _layout केवल एक दृश्य है जो एक दृश्य लपेटता है। (वे सभी के साथ शुरू नहीं करते हैं <!DOCTYPE html>)। तो यह पूरी तरह से संभव हो सकता है _ सप्ताह के दिन यानी कुछ संपत्ति के अनुसार _layouts को स्विच करना और बंद करना। दिए गए संदर्भ में, यह एसआरपी को एक दृश्य के लिए नियंत्रक के लिए एसआरपी को तोड़ सकता है, जिसके बारे में कुछ निर्णय लेने के लिए _layout पेज व्यूए को इंजेक्ट करता है क्योंकि यह एसआरपी दायरे से परे है। यह केवल ViewA <> ViewModelA का समर्थन करने के लिए मौजूद है।
2:15 बजे प्रिज्म

11

उपयोग:

@{
    Layout = null;
 }

_ViewStart में निर्दिष्ट लेआउट से छुटकारा पाने के लिए।


2

बस दृश्य को एक आंशिक दृश्य के रूप में बनाएं ताकि कोई लेआउट फ़ाइल का उपयोग न हो।


2

मैं लेआउट के बिना लॉगिन पृष्ठ प्रदर्शित करना चाहता था और यह मेरे लिए बहुत अच्छा काम करता है। (यह _ViewStart.cshtml फ़ाइल है) आपको नियंत्रक में ViewBag.Title को सेट करने की आवश्यकता है।

@{
    if (! (ViewContext.ViewBag.Title == "Login"))
    {
        Layout = "~/Views/Shared/_Layout.cshtml";        
    } 
}

मुझे पता है कि थोड़ी देर हो गई है लेकिन मुझे उम्मीद है कि इससे कुछ शरीर को मदद मिलेगी।


2

प्रक्रिया 1: दृश्य फ़ोल्डर की मूल निर्देशिका में _ViewStart फ़ाइल का उपयोग करके लेआउट का नियंत्रण

यह विधि आपके ASP.NET MVC एप्लिकेशन में लेआउट रेंडरिंग को नियंत्रित करने के लिए शुरुआती के लिए सबसे सरल तरीका है। हम नियंत्रक की पहचान कर सकते हैं और लेआउट को बराबर नियंत्रक के रूप में प्रस्तुत कर सकते हैं, ऐसा करने के लिए हम अपने कोड को व्यू फ़ोल्डर की रूट डायरेक्टरी में _ViewStart फ़ाइल में लिख सकते हैं। निम्नलिखित एक उदाहरण दिखाता है कि यह कैसे किया जा सकता है।

 @{
 var controller = HttpContext.Current.Request.RequestContext.RouteData.Values["Controller"].ToString();
 string cLayout = "";
 if (controller == "Webmaster") {
 cLayout = "~/Views/Shared/_WebmasterLayout.cshtml";
 }
 else {
 cLayout = "~/Views/Shared/_Layout.cshtml";
 }
 Layout = cLayout;
 }

प्रक्रिया 2: ActionResult से रिटर्न करके लेआउट सेट करें

ASP.NET MVC की एक बड़ी विशेषता यह है कि, हम ActionResult से लेआउट वापस करके डिफ़ॉल्ट लेआउट रेंडरिंग को ओवरराइड कर सकते हैं। तो, यह आपके ASP.NET MVC एप्लिकेशन में विभिन्न लेआउट को प्रस्तुत करने का एक तरीका भी है। निम्नलिखित कोड नमूना दिखाते हैं कि यह कैसे किया जा सकता है।

public ActionResult Index()
{
 SampleModel model = new SampleModel();
 //Any Logic
 return View("Index", "_WebmasterLayout", model);
}

प्रक्रिया 3: देखें - वार लेआउट (शीर्ष पर प्रत्येक दृश्य के भीतर लेआउट को परिभाषित करके)

ASP.NET MVC हमें दृश्य पर लेआउट को परिभाषित करके डिफ़ॉल्ट लेआउट रेंडरिंग को ओवरराइड करने के लिए इतनी बड़ी सुविधा और फैक्स प्रदान करता है। इसे लागू करने के लिए हम प्रत्येक दृश्य में निम्नलिखित तरीके से अपना कोड लिख सकते हैं।

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

प्रक्रिया 4: प्रत्येक निर्देशिका में _ViewStart फ़ाइल को रखना

यह आपके ASP.NET MVC अनुप्रयोग में प्रत्येक नियंत्रक के लिए अलग-अलग लेआउट सेट करने का एक बहुत ही उपयोगी तरीका है। यदि हम प्रत्येक निर्देशिका के लिए डिफ़ॉल्ट लेआउट सेट करना चाहते हैं, तो हम नीचे दी गई आवश्यक लेआउट जानकारी के साथ प्रत्येक निर्देशिका में _ViewStart फ़ाइल डालकर ऐसा कर सकते हैं:

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

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