ASP.NET MVC में मास्टर पेज पर डेटा पास करना


102

MVC नियमों को तोड़ने के बिना मास्टर पेज (ASP.NET MVC का उपयोग करके) को पास करने का आपका तरीका क्या है?

व्यक्तिगत रूप से, मैं अमूर्त नियंत्रक (बेस कंट्रोलर) या बेस क्लास को कोड करना पसंद करता हूं जिसे सभी विचारों के लिए पास किया जाता है।


1
मैं कैसे मैं इस में कामयाब रहे पर एक गाइड ने लिखा है: britishdeveloper.co.uk/2010/06/... मदद करनी चाहिए
BritishDeveloper

जवाबों:


77

यदि आप अपने विचार पसंद करते हैं, तो यह आपके लिए काम करने वाले डेटा वर्गों को दृढ़ता से टाइप कर सकता है। अन्य समाधान शायद अधिक सही हैं लेकिन यह डिजाइन और व्यावहारिकता IMHO के बीच एक अच्छा संतुलन है।

मास्टर पृष्ठ एक दृढ़ता से टाइप किया गया दृश्य डेटा वर्ग लेता है जिसमें केवल उसके लिए प्रासंगिक जानकारी होती है:

public class MasterViewData
{
    public ICollection<string> Navigation { get; set; }
}

उस मास्टर पेज का उपयोग करने वाला प्रत्येक दृश्य अपनी जानकारी युक्त एक दृढ़ता से टाइप किया गया डेटा वर्ग लेता है और मास्टर पृष्ठों के डेटा को प्राप्त करता है:

public class IndexViewData : MasterViewData
{
    public string Name { get; set; }
    public float Price { get; set; }
}

चूंकि मैं व्यक्तिगत नियंत्रकों को मास्टर पेज डेटा को एक साथ रखने के बारे में कुछ भी जानना नहीं चाहता हूं, मैं उस तर्क को एक कारखाने में संलग्न करता हूं जो प्रत्येक के लिए पारित किया जाता है:

public interface IViewDataFactory
{
    T Create<T>()
        where T : MasterViewData, new()
}

public class ProductController : Controller
{
    public ProductController(IViewDataFactory viewDataFactory)
    ...

    public ActionResult Index()
    {
        var viewData = viewDataFactory.Create<ProductViewData>();

        viewData.Name = "My product";
        viewData.Price = 9.95;

        return View("Index", viewData);
    }
}

वंशानुक्रम संबंध को अच्छी तरह से देखने के लिए मास्टर से मेल खाता है, लेकिन जब यह धारावाहिक / उपयोगकर्ता नियंत्रण प्रदान करने की बात आती है तो मैं उनके दृश्य डेटा को पृष्ठ दृश्य डेटा, जैसे

public class IndexViewData : MasterViewData
{
    public string Name { get; set; }
    public float Price { get; set; }
    public SubViewData SubViewData { get; set; }
}

<% Html.RenderPartial("Sub", Model.SubViewData); %>

यह केवल उदाहरण कोड है और जैसा कि संकलन करने का इरादा नहीं है। ASP.Net MVC 1.0 के लिए डिज़ाइन किया गया।


4
यह स्कॉट गुथेरी द्वारा सुझाई गई विधि है, इसलिए मुझे सहमत होना होगा।
साइमन फॉक्स

@ शिमोन फॉक्स - स्कॉचग की सिफारिश के लिए एक लिंक मिला है? नहीं मिला।
१०:१०


माफ़ करना। इसका हिस्सा समझने में थोड़ी परेशानी हुई। कंट्रोलर के लिए कंस्ट्रक्टर IVIVDataFactory का एक उदाहरण पारित किया गया है, लेकिन सिस्टम एक पैरामीटर रहित कंस्ट्रक्टर की उम्मीद कर रहा है। मैं उस C # सिंटैक्स (विशेष रूप से इंटरफ़ेस के लिए "MasterViewData, नया ()") से परिचित नहीं हूं। क्या कोई इसे समझा सकता है या मुझे किसी अच्छे संसाधन की ओर संकेत कर सकता है। धन्यवाद।
जेसन

5
मुझे काम करने के लिए दृढ़ता से टाइप किए गए मॉडल पसंद हैं, लेकिन मैं अपने सभी अन्य मॉडलों और कार्यों के साथ मास्टर डेटा को युग्मित करने का बहुत बड़ा प्रशंसक नहीं हूं। इस धागे में कूदते हुए थोड़ी देर हो गई, लेकिन मैंने मास्टर डेटा के लिए अपना दृष्टिकोण पोस्ट किया जो चीजों को अधिक ढीला रखता है।
टोड मेनियर

59

मैं गुरुत्व के डेटा-चालित टुकड़ों को विभाजन में तोड़ना और Html.RenderAction का उपयोग करके उन्हें प्रदान करना पसंद करता हूं । यह लोकप्रिय दृश्य मॉडल इनहेरिटेंस दृष्टिकोण पर कई अलग-अलग फायदे हैं:

  1. मास्टर दृश्य डेटा "नियमित" दृश्य मॉडल से पूरी तरह से डिकोड किया गया है। यह वंशानुक्रम पर रचना है और अधिक शिथिल युग्मित प्रणाली में परिणाम है जो बदलने में आसान है।
  2. मास्टर व्यू मॉडल पूरी तरह से अलग कंट्रोलर एक्शन द्वारा बनाए जाते हैं। "नियमित" कार्यों को इस बारे में चिंता करने की ज़रूरत नहीं है, और एक दृश्य डेटा फैक्टरी की कोई आवश्यकता नहीं है, जो मेरे स्वाद के लिए अत्यधिक जटिल लगता है।
  3. यदि आप अपने डोमेन को अपने दृश्य मॉडल में मैप करने के लिए AutoMapper जैसे उपकरण का उपयोग करते हैं, तो आपको कॉन्फ़िगर करना आसान लगेगा क्योंकि आपके दृश्य मॉडल आपके डोमेन मॉडल के अधिक निकट होंगे जब वे मास्टर व्यू डेटा को इनहेरिट नहीं करेंगे।
  4. मास्टर डेटा के लिए अलग-अलग एक्शन विधियों के साथ, आप पृष्ठ के कुछ क्षेत्रों में आसानी से आउटपुट कैशिंग लागू कर सकते हैं। आमतौर पर मास्टर व्यू में डेटा होता है जो मुख्य पृष्ठ सामग्री की तुलना में कम बार बदलता है।

3
+1। एक और लाभ यह है कि आप एक ही दृश्य का उपयोग कर सकते हैं वर्तमान रनटाइम स्थिति के आधार पर विभिन्न मास्टर पेज।
स्ट्रिपिंगवर्यर

1
मुझे यह उत्तर बहुत पसंद है - उल्लिखित अन्य दृष्टिकोण जटिल से थोड़ा अधिक लगते हैं।
धान

2
यह मेरी राय में सबसे सुरुचिपूर्ण समाधान है।
ऑटोनोमैट

1
यह समाधान मुझे भी सबसे अच्छा लगता है। बहुत - बहुत धन्यवाद!
जिमडैनियल

1
यह एक शानदार तरीका है, लेकिन याद रखें कि आपको अभी भी अपने "आंशिक कार्यों" के लिए मार्ग निर्दिष्ट करना है। इस उत्तर को देखें stackoverflow.com/a/3553617/56621
Alex

20

संपादित करें

जेनेरिक एरर ने नीचे बेहतर उत्तर दिया है। कृपया इसे पढ़ें!

मूल उत्तर

Microsoft ने वास्तव में इसे संभालने के लिए "आधिकारिक" तरीके से एक प्रविष्टि पोस्ट की है । यह उनके तर्क की व्याख्या के साथ एक कदम-दर-चरण चलना प्रदान करता है।

संक्षेप में, वे एक अमूर्त नियंत्रक वर्ग का उपयोग करने की सलाह देते हैं, लेकिन अपने लिए देखें।


धन्यवाद! यह उदाहरण बिल्कुल वही है जो मैं कर रहा हूं ... डेटाबेस से आने वाले प्रत्येक पृष्ठ पर श्रेणी।
मार्टिन

स्कॉट गुथेरी, एमवीसी के लेखकों में से एक @Generic त्रुटि द्वारा प्रदान किए गए समाधान की सिफारिश करता है
शमौन फॉक्स

1
ओ के द्वारा उत्तर के रूप में आधिकारिक तौर पर सही और स्वीकार किए जाने पर भी सर्वश्रेष्ठ उत्तर देने के निर्देशन के लिए +1।
इस्माइल

ओ के द्वारा उत्तर के रूप में आधिकारिक तौर पर सही और स्वीकार किए जाने पर भी सर्वश्रेष्ठ उत्तर देने के निर्देशन के लिए +1।
डेव जेलिसन

दरअसल, टोड मेनियर का वर्तमान में इसके लिए सबसे अच्छा जवाब है।
andreialecu

7

अमूर्त नियंत्रक एक अच्छा विचार है, और मुझे एक बेहतर तरीका नहीं मिला है। मुझे यह देखने में दिलचस्पी है कि अन्य लोगों ने क्या किया है, साथ ही साथ।


3

2

मुझे लगता है कि आपके पास दृश्य में जाने वाली सभी मॉडल वस्तुओं के लिए एक सामान्य अभिभावक असाधारण रूप से उपयोगी है।

वैसे भी पृष्ठों के बीच हमेशा कुछ सामान्य मॉडल गुण होते हैं।


0

Request.Params ऑब्जेक्ट उत्परिवर्तनीय है। अनुरोध प्रसंस्करण चक्र के भाग के रूप में इसे स्केलर मान जोड़ना बहुत आसान है। दृश्य के दृष्टिकोण से, वह जानकारी QueryString या FORM POST में प्रदान की जा सकती थी। hth


0

मुझे लगता है कि एक और अच्छा तरीका कुछ इंटरफ़ेस के साथ देखने के लिए इंटरफ़ेस बनाने के लिए हो सकता है जैसे कुछ इंटरफ़ेस के ParentView, इसलिए आप इसे दोनों नियंत्रणों के लिए उपयोग कर सकते हैं, जो पृष्ठ (पैरेंट कंट्रोल) के संदर्भ के लिए और मास्टर विचारों के लिए जिसे एक्सेस किया जाना चाहिए। देखा गया।


0

अन्य समाधानों में लालित्य का अभाव है और बहुत लंबा है। मैं लगभग पूरे एक साल बाद यह बहुत दुखद और कमज़ोर चीज़ करने के लिए माफी माँगता हूँ:

<script runat="server" type="text/C#">
    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        MasterModel = SiteMasterViewData.Get(this.Context);
    }

    protected SiteMasterViewData MasterModel;
</script>

तो स्पष्ट रूप से मेरे पास SiteMasterViewData पर यह स्थिर तरीका Get () है जो SiteMasterViewData को लौटाता है।


कई लोगों के लिए यह थोड़ा हैकिंग या 'अशुद्ध' लग सकता है, लेकिन यह जल्दी से काम पूरा कर लेता है
argh

ओह। आपका कोड यह बनाए रखने के लिए बहुत अधिक कठिन लगता है कि यदि आपने Html.RenderAction () का उपयोग किया था।
दान एस्पारज़ा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.