2011-06-07 7 views
11

के लिए मॉडल मॉडल डेटा सुनिश्चित करने के लिए सबसे शानदार तरीका मेरे आवेदन में मेरे पास कुछ मूल उपयोगकर्ता जानकारी है जिसे प्रत्येक पृष्ठ (नाम, प्रोफ़ाइल आईएमजी) पर प्रदर्शित करने की आवश्यकता है। इस समय मैंने _Layout.cshtml पृष्ठ में ApplicationBaseModel नामक कक्षा होने के लिए मॉडल को बस सेट किया है और पूरे एप्लिकेशन में प्रत्येक अन्य दृश्य मॉडल को इस वर्ग से प्राप्त होना चाहिए, और प्रत्येक कार्रवाई को मूल मॉडल के लिए उपयुक्त डेटा सेट करना होगा।_Layout.cshtml

मुझे इस तरह से सरल विरासत नहीं है, यह तथ्य है कि प्रत्येक एकल विधि विधि में मुझे डेटा को पुनः प्राप्त करना होगा और इसे दृश्य मॉडल में संग्रहित करना होगा। मेरी राय में एक बहुत ही सुरुचिपूर्ण समाधान नहीं है।

किसी को भी इस मुद्दे को हल करने के अन्य तरीकों पर कोई विचार है?

+0

क्या आप रेजर का उपयोग कर रहे हैं? – mnemosyn

+0

हाँ मैं रेज़र का उपयोग कर रहा हूं – jcvandan

+0

कोई बात नहीं ... मैं पेज बेस प्रकार (जो रेज़र-विशिष्ट है) को बदलने के बारे में सोच रहा हूं, लेकिन यह आपकी समस्या का समाधान नहीं करता है * और * यह जटिल है ... क्षमा करें – mnemosyn

उत्तर

23

मैं BaseController बनाउंगा जो Initialize() ओवरराइड में डेटा पुनर्प्राप्त करेगा और इसे ViewBag संपत्ति पर सेट करेगा। अब BaseController से बनाए गए प्रत्येक नियंत्रक को प्राप्त करें और अपने लेआउट में ViewBag संपत्ति का उपयोग अपने उपयोगकर्ता डेटा तक पहुंचने के लिए करें।

public class BaseController : Controller 
{ 
    protected override void Initialize(System.Web.Routing.RequestContext requestContext) 
    { 
     base.Initialize(requestContext); 

     // retireve data 
     var data = new ApplicationBaseModel(); 

     // set to viewbag 
     ViewBag.UserData = data; 
    } 
} 

इस तरह आप ApplicationBaseModel से अपने सभी मॉडल वर्गों प्राप्त करने के लिए नहीं है। आप दृढ़ता से टाइप किए गए विचार और अतिरिक्त रूप से अपने उपयोगकर्ता डेटा को ViewBag संपत्ति के रूप में देख सकते हैं।

+0

नाइस समझौता, धन्यवाद। –

+0

यह एक सभ्य समाधान की तरह दिखता है। 'बेसकंट्रोलर 'से प्राप्त प्रत्येक नियंत्रक के लिए' बेसकंट्रोलर। प्रारंभ करें 'होगा या इसे' बेसकंट्रोलर 'से प्राप्त पहले नियंत्रक में एक क्रिया के आमंत्रण पर केवल एक बार निष्पादित किया जाएगा। दूसरे शब्दों में, यदि मेरे पास 3 नियंत्रक हैं - 'होम कंट्रोलर', 'कंट्रोलर', 'लेखा नियंत्रक', और उपयोगकर्ता पृष्ठ पर लिंक से सभी 3 नियंत्रक तक पहुंचता है, तो 'बेसकंट्रोलर' को 3 बार निष्पादित किया जाएगा, या केवल एक बार एप पूल का रीसाइक्लिंग होने तक ऐप का जीवनकाल)? – Shiva

+0

@ शिवा: यह एक इंस्टेंस विधि है, इसलिए इसे प्रत्येक कंट्रोलर इंस्टेंस के लिए और प्रत्येक अनुरोध पर भी निष्पादित किया जाएगा, इससे पहले कि किसी भी एक्शन रिसैट विधियों को बुलाया जाए। ऐप पूल लाइफ चक्र के साथ आप जो वर्णन करते हैं वह स्थिर तरीकों पर लागू होगा। – DanielB

3

जब आप व्यूबैग डेटा जेनरेट करना चाहते हैं, तो आप ऑनएक्शन एक्सेलिंग या ऑनएक्शन एक्स्क्टेड किए गए कार्यों का भी उपयोग कर सकते हैं। यह अधिक उपयुक्त हो सकता है क्योंकि कुछ डेटा नियंत्रक के समय उपलब्ध नहीं हो सकता है।

public class MyController : Controller 
{ 
    //Executes before every action 
    protected override void OnActionExecuting(ActionExecutedContext context) 
    { 
     //Call the method from the base class 
     base.OnActionExecuting(context); 

     //Create the ViewBag data here 
     ViewBag.XYZ = XYZ(); 
    } 

    //Executes after every action 
    protected override void OnActionExecuted(ActionExecutedContext context) 
    { 
     //Call the method from the base class 
     base.OnActionExecuted(context); 

     //Create the ViewBag data here 
     ViewBag.XYZ = XYZ(); 

    } 
} 
+1

+1 हालांकि मेरा डेटा ऑब्जेक्ट सृजन पर उपलब्ध होगा – jcvandan

1

एक अन्य विकल्प लेआउट का मानना ​​है कि डेटा की आवश्यकता के कुछ हिस्सों बाहर चीर, और उन्हें partials में जगह होगी। फिर अपने लेआउट व्यू से एचटीएमएल बनाएं। क्रियाओं को क्रिया कॉल करें जो उन आंशिक को आवश्यक व्यूमोडेल डेटा के साथ वापस कर दें।

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