2011-10-27 18 views
12

का उपयोग कर रहा ASP.NET MVC 3.0 में नया हूँ और MVC ViewModel डिजाइन का उपयोग एक आवेदन बनाने की कोशिश बाइंडिंग के लिए उत्तम आचरण ..MVC .. ViewModel इंटरफेस उदाहरण

मैं सोच रहा था क्या सर्वोत्तम प्रथाओं regrading कर रहे हैं नियंत्रकों ViewModels के लिए और नीचे कुछ प्रश्न हैं .. यह मेरी समझ अब तक है (जो गलत हो सकती है) ..

  • हम मॉडल बनाते हैं।
  • एक ही नाम के साथ एक नई कक्षा और घोषणा गुण बनाकर व्यू मॉडेल बनाएं और बेस मॉडल कक्षाओं के रूप में टाइप करें (बेस मॉडल के आईडी फ़ील्ड्स सहित जिन्हें आप बाद में अपडेट करना चाहते हैं .. और कक्षाएं किसी भी तरह से लिंक नहीं हैं)।
  • प्रत्येक बेस मॉडल के लिए एक रिपोजिटरी बनाएं (डेटा ect ढूंढने और सहेजने के लिए)।
  • प्रत्येक व्यूमोडल्स के लिए एक नियंत्रक कार्रवाई बनाएं (जो मूल्यों को पुनर्प्राप्त करने के लिए बेस क्लास के भंडारों तक पहुंचें और इन मानों को व्यूमोडेल में रखें, फिर व्यूमोडेल को व्यूमोडेल व्यू में पास करें)।
  • ViewModels से दृश्य (ViewModel दृश्य)
  • में ViewModel नियंत्रक अद्यतन (बाद का) विधि अपडेट ViewModel वस्तु प्राप्त है और यह बेस मॉडल वस्तुओं में तब्दील (शायद Automapper का उपयोग करें?) और अगले बचाने के बेस मॉडल वापस वस्तुओं को बनाने के अपने भंडारों का उपयोग करके और इस तरह बाध्यकारी लागू करें? "TryUpdate < 'आईपर्सन> (व्यक्ति)", "TryUpdate <' आईपलेस> (स्थान);" (यह गलत लगता है, इसका उद्देश्य मूल्यों को वापस व्यूमोडेल से मूल वर्गों में रखना है, बाध्यकारी लागू करना, भंडारों का उपयोग करके आधार मॉडल को वापस सहेजना है! .. यह रिपॉजिटरीज़ का उपयोग करने के लिए प्रतीत नहीं होता .. TryUpdate < 'आईपर्सन> (व्यक्ति); मैं इस तरह कुछ देखने की उम्मीद करता हूं: व्यक्ति। सेव (आईपीरसन) .. जहां "व्यक्ति में मान होते हैं", "एसवेव भंडार है", और "आईपर्सन में बाइंडिंग के लिए उपयोग करने के लिए बाध्यकारी विशेषताएँ हैं"? .. अगर यह सही है सुनिश्चित नहीं हैं ..

अब तक मैं एक नया वर्ग बनाने और एक ही नाम का उपयोग विभिन्न आधार मॉडल से विशेषताओं जोड़कर ViewModels बनाया है इस बिंदु मैं निम्नलिखित प्रश्न हैं पर:।

प्रश्न 1: क्या प्रत्येक व्यू मॉडेल का अपना सी है ऑनलाइनर और इसके मूल्य प्राप्त करने के लिए प्रत्येक बेस मॉडल रिपोजिटरी कक्षाओं तक पहुंच सकते हैं?

प्रश्न 2: व्यूमोडेल में आपको उन सभी मूल मॉडलों का आईडी फ़ील्ड शामिल करना चाहिए, जिनके आप गुणों का उपयोग कर रहे हैं, इस पर विचार करते हुए कि आप व्यू मॉडल्स कंट्रोलर के माध्यम से बेस मॉडल्स रिपोजिटरी में अपडेट को पोस्ट करना चाहते हैं (आवश्यकता है आईडी मान)?

प्रश्न 3: सहेजने के लिए भंडार का उपयोग कर नियंत्रक में मॉडल को बाध्य करने के लिए आप इंटरफ़ेस का उपयोग करके विशेषताओं को कैसे बाध्य करेंगे।

  • 2x साधारण मॉडल, 1x सरल ViewModel, के लिए 1x इंटरफ़ेस:

    मैं एक ट्यूटोरियल या संसाधन है कि कदम उदाहरण के द्वारा एक कदम में सब कुछ बताते हैं खोजने में असमर्थ किया गया है, एक पूरा जवाब निम्नलिखित उदाहरण होगा बाध्यकारी, अद्यतन पर बाध्यकारी के लिए एक इंटरफ़ेस वर्ग का उपयोग कर 1x सरल नियंत्रक, 1x भंडार .. यानी

// MODEL1

public class Person 
{ 
    int PersonID {get;set;} 
    string FirstName {get;set;} 
    string LastName {get;set;} 
    DateTime DOB {get;set} 
} 

// MODEL2

public class Place 
{ 
    int PlaceID {get;set;} 
    string Description {get;set;} 
    string AreaType {get;set;} 
    string PostCode {get;set;} 
} 

// ViewModel (मॉडल से विशेषताओं वाली)

publc class ViewModel 
{ 
    //Person attributes 
    int PersonID {get;set;} 
    string FirstName {get;set;} 
    string LastName {get;set;} 

    //Place attributes 
    int PlaceID {get;set;} 
    string Description {get;set;} 
    string AreaType {get;set;} 

    //other attributes 
    string someOtherAttributeForDisplay {get;set} 
} 

// MODEL1 इंटरफेस (पर बाध्यकारी के लिए मॉडल)

public interface IPerson 
{ 
    string FirstName {get;set;} 
} 

// MODEL2 (मॉडल पर बाध्यकारी के लिए)

public interface IPlace 
{ 
    string Description {get;set;} 
    string AreaType {get;set} 
} 

// ViewModelController इंटरफ़ेस?

{ 
    //What goes here? 
} 

// रिपोजिटरी?

{ 
    //what goes here? 
} 
+0

देख लिया? –

+0

हाय मिच, मैं अपनी परियोजनाओं में एकता और एंटीलिब जोड़ने के लिए NuGet का उपयोग कर रहा हूं, मुझे अभी तक उनके उद्देश्यों के बारे में पूरा यकीन नहीं है .. – HonourCode

उत्तर

6

मुझे लगता है कि आप एक बहुत ही सरल अवधारणा को खत्म कर सकते हैं।

सबसे पहले कुछ सामान्य नियमों:

  • TryUpdateModel प्रयोग न करें। बस मत करो
  • इसी कारण से, से अपने दृश्य मॉडल को मैप करने के लिए किसी भी "ऑटो" मैपिंग मैपर का उपयोग न करें। दूसरे रास्ते को ऑटो मैपिंग (इकाई से मॉडल देखने के लिए) ठीक है।

इंटरफेस का उपयोग अनावश्यक है।

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

हम अपने दृश्य मॉडल के लिए {नियंत्रक} {एक्शन} मॉडल के नामकरण सम्मेलन का उपयोग करते हैं। तो "पोस्ट" नियंत्रक पर "सूची" नाम की एक क्रिया के लिए हमारे पास "पोस्टलिस्ट मोडेल" नामक एक मॉडल होगा।

अंत में, आप Nuget उपयोग कर रहे हैं मेरी प्रतिक्रिया यहाँ Real example of TryUpdateModel, ASP .NET MVC 3

+0

आपके उत्तर के लिए धन्यवाद .. क्या आप जानते हैं कि आप मूल्यों को बाध्य कर सकते हैं मॉडल के बाद एक इंटरफ़ेस समेत TryUpdate विधि? यानी TryUpdate <'IPerson> (व्यक्ति) मुझे यहां कुछ जानकारी मिली है कि मैं निम्नलिखित रहा हूं लेकिन मेरे संस्करण में थोड़ा बदल गया है ताकि गुणों को प्रदर्शित किया जा सके और बाद में नियंत्रक (अवधारणा को) में बाध्य किया जा सके: http://codetunnel.com/ब्लॉग/पोस्ट/79/एस्पनेट-एमवीसी-मॉडल-बाइंडिंग-सुरक्षा .. क्या आपको लगता है कि यह आदमी अपने घुमावदार या कुछ पर है? :) – HonourCode

+0

ऐसा लगता है कि इस तरह से इंटरफेस का उपयोग केवल TryUpdateModel (अपडेट किए गए गुणों को सीमित करने के लिए) का उपयोग करने की कमियों को संबोधित करने के लिए है, कुछ सरल बाएं-दाएं मैपिंग के माध्यम से हासिल किया जा सकता है। –

+0

लाभ यह है कि आप गुणों को मैप करने के लिए एक ऑटोमैपर का उपयोग कर सकते हैं ताकि आप बाएं-दाएं मैपिंग न करने के द्वारा कोड को कम कर सकें, इसके बजाय आप ऑब्जेक्ट्स को पास कर सकते हैं ..और यदि फिडलर गुणों को बदलता है तो इससे कोई फर्क नहीं पड़ता क्योंकि बाध्यकारी वांछित प्रयासों को TryUpdate <'IModel> (मॉडल) में सहेजने की अनुमति नहीं देता है, वैसे ही बाएं-दाएं मैपिंग काम करता है .. मैं सोच रहा था, कौन सा नियंत्रक एक ViewModel की आवश्यकता होगी? .. यह स्वयं है या यह बेस क्लास नियंत्रकों का उपयोग करेगा? : एस .. – HonourCode

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