2009-03-13 15 views
9

कार्यशीलता का एक बहुत कम स्तर offeres। यह प्रदान नहीं करता है, न ही एक सच्चे 'उप-नियंत्रक' मॉडल प्रदान करने का प्रयास करता है *।ModelFactory हल करने के लिए 'RenderPartial' मुद्दा

मेरे पास 'रेंडरपार्टियल()' के माध्यम से बढ़ते नियंत्रणों की संख्या बढ़ रही है।

1) नियंत्रण है कि एक विशेष पेज के प्रत्यक्ष वंश कि कि पेज के मॉडल का उपयोग

2) नियंत्रण है कि एक विशेष पृष्ठ कि उपयोग की प्रत्यक्ष वंशज हैं कर रहे हैं: वे 3 मुख्य श्रेणियों में आते उस पृष्ठ का मॉडल additional key of some type के साथ। 'डेटा रिपेटर' के कार्यान्वयन को सोचें।

3) पृष्ठ पर असंबद्ध कार्यक्षमता का प्रतिनिधित्व करने वाले नियंत्रण पर दिखाई देते हैं। यह बैनर रोटेटर से फीडबैक फॉर्म, स्टोर लोकेटर, मेलिंग सूची साइनअप से कुछ भी हो सकता है। कुंजी बिंदु यह परवाह नहीं करता है कि यह किस पृष्ठ पर रखा जाता है।

जिस तरह से ViewData मॉडल वहाँ काम करता है की

केवल प्रति अनुरोध एक मॉडल वस्तु मौजूद है - thats कुछ भी subcontrols जरूरत पेज मॉडल में मौजूद होना चाहिए कहने के लिए।

अंततः MVC टीम उम्मीद है कि एक सच्चे 'subcontroller' मॉडल के साथ बाहर आ जाएगा, लेकिन तब तक मैं सिर्फ मुख्य पृष्ठ मॉडल है कि बच्चे भी नियंत्रित होता है की जरूरत के लिए कुछ भी जोड़ रहा।

की (3) के ऊपर इस 'ProductModel' के लिए अपने मॉडल का अर्थ है 'MailingListSignup' मॉडल के लिए एक क्षेत्र को शामिल करने के लिए हो सकता है मामले में। जाहिर है कि यह आदर्श नहीं है, लेकिन मैंने इसे वर्तमान ढांचे के साथ सबसे अच्छे समझौते पर स्वीकार कर लिया है - और भविष्य में उप-नियंत्रक मॉडल के लिए 'किसी भी दरवाजे को बंद करने' की संभावना है।

नियंत्रक एक मॉडल के लिए डेटा प्राप्त करने क्योंकि मॉडल वास्तव में सिर्फ एक गूंगा डेटा संरचना है कि जहां यह से अपने डेटा हो जाता है पता नहीं है किया जाना चाहिए के लिए जिम्मेदार होना चाहिए। लेकिन मैं नहीं चाहता कि नियंत्रक को कई अलग-अलग स्थानों में मॉडल बनाना पड़े।

जो मैंने शुरू किया है वह मुझे मॉडल बनाने के लिए एक कारखाना बना रहा है। इस कारखाने को नियंत्रक द्वारा कहा जाता है (मॉडल कारखाने के बारे में नहीं जानता)।

public static class JoinMailingListModelFactory { 

     public static JoinMailingListModel CreateJoinMailingListModel() { 

      return new JoinMailingListModel() 
      { 
       MailingLists = MailingListCache.GetPartnerMailingLists(); 
      }; 
     } 
    } 

तो मेरा वास्तविक प्रश्न यह है कि इस मुद्दे के साथ अन्य लोग वास्तव में मॉडल बना रहे हैं। नई एमवीसी सुविधाओं के साथ भावी संगतता के लिए सबसे अच्छा तरीका क्या होगा?


  • एनबी: वहाँ RenderAction() साथ मुद्दों है कि मैं यहाँ पर नहीं जाऊंगा कर रहे हैं - अपने ही MVCContrib में और ASP.NET-MVC के RTM संस्करण में नहीं होगा कि कम से कम नहीं। अन्य मुद्दों ने sufficent problems का कारण बना दिया कि मैंने इसका उपयोग नहीं किया। तो अब के लिए नाटक करें कि केवल RenderPartial() मौजूद है - या कम से कम यही वह है जिसे मैंने उपयोग करने का निर्णय लिया है।

उत्तर

2

इस परिदृश्य के लिए मैंने जो दृष्टिकोण देखा है वह आंशिक दृश्य के लिए डेटा को पॉप्युलेट करने के लिए एक एक्शन-फ़िल्टर का उपयोग करना है - यानी।उपclass ActionFilterAttributeOnActionExecuting में, डेटा को व्यूडेटा में जोड़ें। फिर आपको का उपयोग करने वाले विभिन्न कार्यों को सजाने के लिए है जो फ़िल्टर के साथ आंशिक दृश्य हैं।

+0

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

+0

यह बहुत सोच की तरह लगता है ;- –

+0

मेरे ऐप में कई स्थानों पर इस दृष्टिकोण का उपयोग कर समाप्त हुआ। दुनिया भर में मॉडलों के लिए कुछ चीजों को लागू करने के लिए यह बहुत साफ है। मैं इसे 'बेस मॉडल' के लिए उपयोग करता हूं जो कि एक मास्टर पेज से संबंधित है और साइट के विभिन्न क्षेत्रों के लिए 'क्षेत्र मॉडल' भी है। काफी लचीला है और जब मैं अपने मॉडलों में चीजों को इंजेक्शन देने में पूरी तरह से प्यार नहीं कर रहा हूं तो यह बहुत अच्छी तरह से काम कर रहा है –

1

एक RenderPartial अधिभार मैं का उपयोग करें कि आप एक नया ViewData स्पष्ट करने देते हैं की नहीं है और मॉडल:

RenderPartial code

आप MVC स्रोत कोड के पिछले लिंक को देखें, तो साथ ही निम्न (देखने के लिए RenderPartialInternal विधि):

RenderPartialInternal code

आप देख सकते हैं कि मूल रूप से प्रतियां ViewData आप एक नया शब्दकोश बनाने और मॉडल सेट पास में इस्तेमाल किया जा सकता है अगर नियंत्रण। तो पृष्ठ में एक मॉडल हो सकता है, लेकिन फिर उप-नियंत्रण में एक अलग मॉडल पास कर सकते हैं।

यदि उप-नियंत्रण सीधे मुख्य दृश्य मॉडल से संदर्भित नहीं हैं, तो आप चाल कर सकते हैं मार्क ग्रेवेल ने आपके कस्टम तर्क को जोड़ने का उल्लेख किया है।

public class ProductViewModel() { 
    public ProductModel productModel; 
    public MailingListSignup signup; 
} 

फिर अपने दृश्य के लिए दृढ़ता से टाइप किया जाना हो:

5
इसके बजाय अपने ProductModel की एक संपत्ति के रूप में MailingListSignup तरह बातें जोड़ने की

, ProductViewModel की तरह एक कक्षा में एक ही स्तर ऐसा दिखता है जैसे दोनों संपुटित ProductViewModel कक्षा। आप Model.productModel पर कॉल करके ProductModel तक पहुंच सकते हैं, और आप Model.signup का उपयोग कर साइनअप क्लास तक पहुंच सकते हैं।

यह फाउलर के 'प्रेजेंटेशन मॉडल' (http://martinfowler.com/eaaDev/PresentationModel.html) की एक ढीली व्याख्या है, लेकिन मैंने इसे कुछ माइक्रोसॉफ्ट देवों जैसे रॉब कॉनरी और स्टीफन वाल्थर द्वारा उपयोग किया है।

+1

मैं अक्सर एमवीवीसी के रूप में एएसपीएनटी एमवीसी का उल्लेख करता हूं :) –

+0

यह आम तौर पर मेरा दृष्टिकोण है, लेकिन यह अभी भी गंध करता है मेरे लिए मजाकियामुझे इस तथ्य को पसंद नहीं है कि बाहरी दृश्य को डेटा प्रदान किया गया है जिसकी आवश्यकता नहीं है। मैंने Html.RenderAction () का उपयोग करने के लिए लिया है जो Html.RenderPartial() से बेहतर उप-नियंत्रकों के लिए प्रॉक्सी के रूप में बेहतर लगता है लेकिन यह अभी भी कुछ कमजोर है। –

+0

@ जेम्स, मैं इसे अपना रास्ता करता हूं, जहां उत्पाद मॉडल और साइनअप मॉडल वास्तविक डेटा मॉडल हैं। लेकिन मैं खुद को सत्यापन एनोटेशन का लाभ खो देता हूं। मैं डोमेन स्तर पर चीजों को सत्यापित करने के लिए फ़्लुएंट सत्यापन का उपयोग करता हूं, ठीक है। – Tom

0

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

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IMailingListSignup>" %> 

ViewModel इंटरफ़ेस लागू करता

public class ProductViewModel:IMailingListSignup 

Thats बिल्कुल नहीं सही लेकिन कुछ मुद्दों को हल करती है: आप अभी भी आसानी से मॉडल के लिए अपने मार्ग से गुण मैप कर सकते हैं। यदि आप MailingListSignup के गुणों के लिए अन्यथा मार्ग पैरामीटर मानचित्र प्राप्त कर सकते हैं तो मैं शर्मिंदा नहीं हूं।

आपको अभी भी मॉडल भरने की समस्या है। यदि देर से नहीं है तो मैं इसे OnActionExecuted में करना पसंद करता हूं। मैं नहीं देखता कि आप OnActionExecuting में मॉडल कैसे भर सकते हैं।

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