2011-02-01 13 views
7

मैं एक बहुत ही सरल अवधारणा के साथ संघर्ष कर रहा हूं। अगर मेरे पास मेरे _Layout.cshtml द्वारा उपयोग के लिए व्यूबैग में कोई मान है, तो मैं उस मान को कैसे और कहां सेट करूं?एएसपी.नेट एमवीसी 3 विचारों में सामान्य डेटा को संभालने के दृष्टिकोण दृष्टिकोण

यहाँ सबसे स्पष्ट (मेरे लिए) विकल्प हैं के रूप में मैं वर्तमान में उन्हें देखें:

  1. प्रत्येक नियंत्रक (सूखी नहीं)
  2. मेरे अपने नियंत्रक नियंत्रक से इनहेरिट आधार बना सकते हैं और सेट में मान सेट करें आधार वर्ग
  3. Global.asax.cs में मान सेट में मूल्य (गंदा लगता है)
  4. डेटा सेट और विश्व स्तर पर फिल्टर रजिस्टर करने के लिए एक ActionFilter बनाएं (यह भी गलत लगता है)
  5. में मान सेट करें _ViewStart.cshtml उदाहरण के लिए

(बहुत गलत और बहुत गंदा लगता है):

_Layout.cshtml


<!DOCTYPE html> 
<html> 
<head runat="server"> 
    <title>@ViewBag.Title</title> 
</head> 
<body> 
    <div id="header"> 
     <h1>Welcome @ViewBag.UserName</h2> 
    </div> 
    <div id="content"> 
     @RenderBody() 
    </div> 
</body> 
</html> 

प्रत्येक नियंत्रक उपयोगकर्ता नाम मूल्य सेट करते हैं, तो यह है कि बहुत नहीं है सूखी। अगर मैं कोडइग्निटर जैसे कुछ के साथ इसका सामना कर रहा था, तो मैं इन सामान्य वस्तुओं को संभालने के लिए अपना खुद का बेस कंट्रोलर बनाउंगा और अपने मजेदार तरीके से जाऊंगा। क्या एएसपी.नेट एमवीसी 3 के साथ एक और पसंदीदा विकल्प है?

+0

वास्तव में, इस विशेष परिदृश्य में - मुझे लगता है कि "उपयोगकर्ता नाम" वास्तव में सत्र/फॉर्म ऑथ टिकट से आएगा। तो हो सकता है कि आप एक HTML सहायक का उपयोग करना चाहें जो कुकी के उपयोगकर्ता नाम को पकड़ने के लिए FormsAuth कोड का उपयोग करता है और एक MvcHtmlString प्रस्तुत करता है - बस एक विचार ... – RPM1984

+0

हमम ... अच्छा बिंदु। शायद @ ViewBag.UserName सबसे अच्छा उदाहरण नहीं है। हालांकि, मैं इस समय बड़ी तस्वीर के साथ वास्तव में अधिक चिंतित हूं। – Greg

+0

@ आरपीएम 1 9 84: यह इस बात से कोई फर्क नहीं पड़ता कि "उपयोगकर्ता नाम" फ़ॉर्म ऑथ से आया है। इसे (व्यूबैग या अन्यथा) में पारित किया जाना चाहिए। दृश्य को कुछ भी "लाने" नहीं देना चाहिए। परीक्षण परिदृश्यों पर भी विचार करें, आप नकली डेटा को इकाई परीक्षण में देखने के लिए पास करना चाहते हैं। यदि आपका विचार "fetching" चीजें हैं तो संभव नहीं है। एमवीसी पैटर्न के पूरे बिंदु को भी काफी हद तक अमान्य कर दिया गया है। आपको चुनने पर नहीं, लेकिन मैंने इस प्रकार की मानसिकता को विभिन्न एमवीसी लेखों (डिफ़ॉल्ट एमवीसी परियोजना टेम्पलेट सहित) में दोहराया है। – Roger

उत्तर

10

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

+0

ग्रोवी। जानकर खुशी हुई कि मैं आधार से पूरी तरह से बंद नहीं हूं। – Greg

+1

मुझे केवल सिथ सौदे को पूर्ण रूप से पता है, लेकिन यह एकमात्र सही उत्तर है। दृश्य केवल मॉडल से पढ़ना है, और केवल नियंत्रक मॉडल को लिख सकता है। यदि आप मजबूत टाइप किए गए मॉडल पर चिपके हुए हैं तो आप बेस मॉडल के साथ-साथ आधार नियंत्रक भी चाहते हैं। – Roger

+1

@tvanfossen। यह एक दिलचस्प दृष्टिकोण है और मैं इसे मौजूदा कोशिश कर रहा हूं। एक सवाल - क्या मैं आधार नियंत्रक के बजाय एक्शनफिल्टर का उपयोग कर सकता हूं और 'ऑनएक्शन एक्स्क्टेड' में हुक कर सकता हूं? मुझे आम डेटा पारित करने की आवश्यकता है, लेकिन केवल विशिष्ट कार्रवाइयों पर और सोचा गया है कि फिल्टर वाले लोगों को सजाए जाने वाले लोग बेहतर होंगे। –

0

मान लें कि मैं ViewBag.PageHeight के पास सभी पृष्ठों के लिए 1000 का डिफ़ॉल्ट मान रखना चाहता हूं लेकिन फिर किसी भी पृष्ठ/दृश्य द्वारा इसे ओवरराइड करने की अनुमति दें। मैं _Layout.cshtml में डालता हूं:

पृष्ठ की ऊंचाई @ (ViewBag.PageHeight ?? 1000)

ऐसा लगता है।

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