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


313

मैं अपने आवेदन में 2 अलग-अलग लेआउट रखना चाहूंगा। मान लीजिए कि एक वेबसाइट के सार्वजनिक अनुभाग के लिए है और दूसरा सदस्य पक्ष के लिए है।

सादगी के लिए प्रत्येक साइट के लिए सभी तर्क 2 अलग नियंत्रकों में बड़े करीने से लिपटे हुए हैं।

  • PublicController
  • StaffController

और यह कि वे प्रत्येक के तहत सभी देखें के लिए एक संबंधित लेआउट है।

  • _PublicLayout.cshtml
  • _StaffLayout.cshtml

मैं यह निर्दिष्ट करने के लिए कि _ViewStart.cshtml फ़ाइल का उपयोग कैसे करूँ कि "पब्लिक" के अंतर्गत सभी दृश्य / एक्शन पब्लिकलाइट का उपयोग करें और "स्टाफ" के तहत सब कुछ स्टाफ़ लयआउट का उपयोग करें?

धन्यवाद!


4
बस के मामले में: यदि आप किसी दिए गए Razorदृश्य के लिए लेआउट को हटाना चाहते हैं, तो बस सेट करेंLayout = null;
लेनिएल मैकाफेर्री

3
अपने उदाहरण के लिए एक टिप्पणी के रूप में, आपको शायद सार्वजनिक और कर्मचारी नाम के नियंत्रक नहीं होना चाहिए। नियंत्रकों को अक्सर कुछ महत्वपूर्ण व्यापारिक संस्थाओं जैसे कि EventController, UserController, या पसंद पर CRUD जैसे कार्रवाई के प्रवेश बिंदु के रूप में लागू किया जाता है। यदि आपका आवेदन यथोचित रूप से बड़ा है, तो एक सार्वजनिक / कर्मचारी नियंत्रक की जिम्मेदारी व्यापक होगी। इसके बजाय क्षेत्रों पर विचार करें। msdn.microsoft.com/en-us/library/ee671793%28VS.100%29.aspx आप इस बारे में जानते होंगे, लेकिन इसे पढ़ने वाले किसी और को गलत विचार मिल सकता है, इसलिए सिर्फ रिकॉर्ड के लिए।
एलेक्स

जवाबों:


558

आप फ़ोल्डर के _ViewStart.cshtmlअंदर एक फ़ाइल रख सकते हैं /Views/Publicजो फ़ोल्डर में डिफ़ॉल्ट एक को ओवरराइड करेगा /Viewsऔर वांछित लेआउट निर्दिष्ट करेगा:

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

सादृश्य द्वारा आप फ़ोल्डर के _ViewStart.cshtmlअंदर एक और फ़ाइल डाल सकते हैं /Views/Staff:

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

आप यह भी निर्दिष्ट कर सकते हैं कि नियंत्रक क्रिया के अंदर कोई दृश्य वापस करते समय किस लेआउट का उपयोग किया जाना चाहिए लेकिन वह प्रति क्रिया है:

return View("Index", "~/Views/Shared/_StaffLayout.cshtml", someViewModel);

फिर भी एक और संभावना एक कस्टम एक्शन फिल्टर है जो लेआउट को ओवरराइड करेगा। जैसा कि आप इसे प्राप्त करने के लिए कई संभावनाएं देख सकते हैं। आपके लिए यह चुनना कि कौन सा आपके परिदृश्य में सबसे अच्छा है।


अपडेट करें:

जैसा कि टिप्पणी अनुभाग में अनुरोध किया गया है, एक एक्शन फ़िल्टर का एक उदाहरण है जो एक मास्टर पृष्ठ का चयन करेगा:

public class LayoutInjecterAttribute : ActionFilterAttribute
{
    private readonly string _masterName;
    public LayoutInjecterAttribute(string masterName)
    {
        _masterName = masterName;
    }

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        base.OnActionExecuted(filterContext);
        var result = filterContext.Result as ViewResult;
        if (result != null)
        {
            result.MasterName = _masterName;
        }
    }
}

और फिर एक नियंत्रक या इस कस्टम विशेषता के साथ एक क्रिया को सजाने के लिए लेआउट को निर्दिष्ट करें जो आप चाहते हैं:

[LayoutInjecter("_PublicLayout")]
public ActionResult Index()
{
    return View();
}

1
@DarinDimitrov मैं कहां बनाऊंगा LayoutInjecterAttribute। ? क्या कोई विशेष स्थान है?
काविविष्णु जू

2
@VeeKeyBee, आप इसे ActionFiltersउप-फ़ोल्डर के अंदर रख सकते हैं ।
डारिन दिमित्रोव

इसके साथ एक संभावित समस्या LayoutInjecterAttribute: इसे नियंत्रक की विधि से पहले कहा जाता है OnException। इसलिए, यदि नियंत्रक अपवाद हैंडलिंग के दौरान दृश्य परिणाम प्रदान करता है, तो लेआउट सेट नहीं किया जाएगा।
जेफ शार्प

MVC के लिए एक नए आदमी के रूप में, मैं इस उत्तर में मुझे सिखाने के लिए धन्यवाद कहना चाहूंगा। हालाँकि मुझे समझ नहीं आ रहा है कि अंदर क्या चल रहा है OnActionExecuted। क्या आप मेरे लिए जवाब अपडेट कर सकते हैं
इमाद

29

एक और तरीका यह है कि दृश्य के अंदर लेआउट को परिभाषित करें:

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

अधिक तरीके करने के लिए, यहां पाया जा सकता है , आशा है कि यह किसी की मदद करता है।


1
यह काम नहीं करेगा - अलग _ViewStart.cshtml के बिना, आपका दृश्य अभी भी अन्य लेआउट में @RenderBody () पद्धति के अंदर प्रस्तुत करेगा।
Tillman32

इस! जब सभी को इन अत्यंत जटिल प्रक्रियाओं को आगे रखना पड़ रहा है, तो आपको यह करने की आवश्यकता है!
जॉर्ज हैर्नवेल

15

यह तरीका शुरुआती लोगों के लिए अपने 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;
}

पूरा लेख यहाँ पढ़ें "ASP.NET MVC में विभिन्न लेआउट को कैसे प्रस्तुत करें"

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