2008-09-17 20 views
97

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

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

+1

मुझे लगता है मैं कैसे कामयाब रहे पर एक गाइड लिखा था इस: http://www.britishdeveloper.co.uk/2010/06/mvc-pass-viewmasterpage-model.html मदद करनी चाहिए – BritishDeveloper

उत्तर

75

यदि आप दृढ़ता से टाइप डेटा कक्षाओं को देखने के लिए अपने विचारों को प्राथमिकता देते हैं तो यह आपके लिए काम कर सकता है। अन्य समाधान शायद सही हैं लेकिन यह डिजाइन और व्यावहारिकता 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); 
    } 
} 

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

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

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

यह केवल उदाहरण कोड है और है के रूप में संकलित करने के लिए इरादा नहीं है। एएसपी.NET एमवीसी 1.0 के लिए बनाया गया है।

+4

इस विधि स्कॉट द्वारा सिफारिश की है गुथरी, तो मुझे सहमत होना होगा। –

+0

@ सिमॉन फॉक्स - स्कॉटू की सिफारिश के लिए एक लिंक मिला? इसे नहीं मिला – orip

+4

http://weblogs.asp.net/scottgu/archive/2007/12/06/asp-net-mvc-framework-part-3-passing-viewdata-from-controllers-to-views.aspx#5415732 –

6

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

0

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

0

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

2

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

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

20

संपादित

Generic Error नीचे एक बेहतर जवाब प्रदान की गई है। कृपया इसे पढ़ें!

मूल उत्तर

माइक्रोसॉफ्ट वास्तव में इस संभाल करने the "official" way पर एक प्रविष्टि पोस्ट किया गया है। यह उनके तर्क की व्याख्या के साथ चरण-दर-चरण चलने वाला मार्ग प्रदान करता है।

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

+0

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

+0

एमवीसी के लेखकों में से एक स्कॉट गुथरी –

+6

से नीचे @ जेनेरिक त्रुटि द्वारा प्रदान किए गए समाधान की सिफारिश करता है, मुझे लगता है कि आधिकारिक तौर पर सही उत्तर देने के लिए आधिकारिक तरीका –

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 रिटर्न SiteMasterViewData पर इस स्थैतिक विधि प्राप्त करें() है: मैं लगभग एक पूरे वर्ष के बाद में यह बहुत ही दु: खी और गरीब बात करने के लिए हमें खेद है।

+0

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

+0

मुझे आश्चर्य है कि एएसपी.नेट एमवीसी 2 ने इस मुद्दे को संबोधित किया है? – rasx

+0

उह। आपका कोड यह सुनिश्चित करने के लिए बहुत कठिन लगता है कि अगर आपने Html.RenderAction() का उपयोग किया था। –

59

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

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

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

+1

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

+2

यह मेरी राय में सबसे सुंदर समाधान है। – autonomatt

संबंधित मुद्दे