2009-03-31 16 views
6

पर व्यूडेटा पास करने के लिए मैं एक एमवीसी उपयोगकर्ता नियंत्रण के लिए अपने एएसपीएनटी एमवीसी मास्टर पेज पर व्यूडेटा पास करने की कोशिश कर रहा हूं जो मैं एक मास्टर पेज पर रखता हूं। उदाहरण के लिए, मैंने एमवीसी उपयोगकर्ता नियंत्रण के रूप में नामों की एक ड्रॉपडाउन सूची बनाई और मैंने इसे अपने मास्टरपेज में रखा।एएसपीनेट एमवीसी मास्टरपेज

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

http://www.asp.net/learn/MVC/tutorial-13-cs.aspx

संपादित: समस्या मैं देख रहा हूँ तथ्य यह है कि मैं अपने masterpage कि ViewData पर निर्भर करता है में एक उपयोगकर्ता नियंत्रण रखना पड़ता है जब, मैं बार बार करना पड़ता है शामिल है कि ViewData प्रत्येक पृष्ठ के लिए जो मास्टरपेज का उपयोग करता है। यह संभव है कि उपरोक्त लिंक में समाधान सबसे अच्छा समाधान है लेकिन मैं उम्मीद कर रहा था कि अन्य विकल्प भी थे।

उत्तर

1

के लिए क्या इसके लायक है, मुझे लगता है कि ट्यूटोरियल से विधि का उपयोग कर रहा एक चालू परियोजना में है और यह बहुत अच्छी तरह से काम करता है

आप यह भी कर सकते हैं, यदि यह डेटा कुछ हद तक स्थैतिक है (जैसे मेनू जो ज्यादा नहीं बदलता है), ऑब्जेक्ट को कैश पर रखना है ताकि प्रत्येक नियंत्रक प्रारंभिकरण के लिए आपका डेटाबेस नहीं कहा जा सके।

4

मास्टर पेज पर पहले से ही व्यूडाटा तक पहुंच है। आप दृढ़ता से उस तक पहुँच टाइप किया चाहते हैं, तो आप दो काम करने की जरूरत है:

  1. एक आधार वर्ग में मास्टर पेज सामान रखो (जैसे CommonViewData)
  2. आप सामान्य ViewMasterPage से पेज इनहेरिट गुरु है <> वर्ग:।

    "%>
+1

जिस समस्या को मैं देख रहा हूं वह यह तथ्य है कि यदि मैं अपने मास्टरपेज में उपयोगकर्ता नियंत्रण रखता हूं जो व्यूडाटा पर निर्भर करता है, तो मुझे उस मास्टर पेज का उपयोग करने वाले प्रत्येक पृष्ठ के लिए व्यूडेटा शामिल करना होगा। – codette

0

मैं काफी तुम्हारी समस्या नहीं मिलता ...

समस्या मैं देख रहा हूँ तथ्य यह है कि मुझे लगता है कि ViewData पर निर्भर करता है मेरी masterpage में एक उपयोगकर्ता नियंत्रण रखना पड़ता है जब, मैं बार-बार शामिल करने की आवश्यकता है उस मास्टर पेज का उपयोग करने वाले प्रत्येक पृष्ठ के लिए व्यूडेटा।

अच्छा हाँ ... निश्चित रूप से आप करते हैं। यदि आपके पास अपने मास्टर पेज में उपयोगकर्ता नियंत्रण है तो निश्चित रूप से आपको उस क्रियान्वयन के लिए आवश्यक डेटा पास करना होगा, प्रत्येक क्रिया & देखें कि उस मास्टरपृष्ठ का उपयोग करता है।

ऐसा नहीं है कि आपको खुद को दोहराना होगा यदि आप बेस नियंत्रक से विरासत में हैं।

क्या आपका मुद्दा यह तथ्य है कि कुछ नियंत्रकों के पास ऐसे कार्य होते हैं जो दोनों उस विशेष मास्टरपेज से प्राप्त विचारों को कॉल करते हैं और नहीं करते हैं? इसलिए यदि आप आधार नियंत्रक को कार्यान्वित कर रहे हैं, तो जो क्रियाएँ उस विशेष मास्टरपेज का उपयोग नहीं करती हैं, उनके पास अभी भी व्यूडेटा होगा ...? (यदि सभी समझ में आता है ;-)

+0

पूरे सवाल से मैं यह सवाल पूछ रहा हूं कि मेरे मूल प्रश्न में दिए गए समाधान में समाधान के विकल्प हैं या नहीं। लेकिन मुझे लगता है कि एमएस "सर्वश्रेष्ठ" समाधान पोस्ट कर रहा है जिसके साथ वे आ सकते हैं। – codette

2

क्या आप संभवतः आधार नियंत्रक वर्ग पर OnActionExecuting विधि का उपयोग कर सकते हैं और वहां दृश्य डेटा को पॉप्युलेट कर सकते हैं?

कुछ की तरह:

protected override void OnActionExecuting(ActionExecutingContext context) 
{ 
    context.Controller.ViewData.Model = GetDataForControl(); 
} 

मैं इसे करने की कोशिश नहीं की है, तो यह सिर्फ एक विचार है ...

1

मैं आमतौर पर मेरी masterpage के लिए एक सार नियंत्रक वर्ग उपयोग करें, यह सबसे अच्छा समाधान है, क्योंकि मास्टरपेज एक "अमूर्त दृश्य" की तरह है। लेकिन मैं व्यूडेटा को शामिल करने के लिए MasgerPageController View() विधि को ओवरराइड करता हूं।

protected override ViewResult View(string viewName, string masterName, object model) 
{ 
    this.ViewData["menu"] = this.PagesRepository.GetPublishPages(); 
    return base.View(viewName, masterName, model); 
} 
+0

स्वच्छ और सरल, धन्यवाद! चार साल बाद और आखिरकार एक उपरांत मिला;) – statue

0

मुझे लगता है कि समाधान सुझाया गया है लेकिन आदर्श समाधान नहीं है। अगर हम बेसकंट्रोलर कन्स्ट्रक्टर में कोड डालते हैं तो इसे एक्शन विधियों के लिए भी बुलाया जा रहा है जिसमें मास्टरपेज नहीं हैं (जैसे पोस्ट विधियां और अजाक्स विधियां)।
मुझे लगता है कि एक बेहतर समाधान (आदर्श नहीं) है एचटीएमएल को कॉल करना। मास्टर पेज में एक्शन विधि।