2012-02-20 18 views
20

मेरी नियंत्रक में एक ViewModel पॉप्युलेट करने के लिए मैं अपने डोमेन मॉडल से एक ProductInfo वर्ग है और मैं अपनी जानकारी के कुछ की जरूरत को भरने के लिए मेरी देखें मॉडलProductStatsVMASP.NET MVC3

आप व्यू मॉडल को कैसे पॉप्युलेट करते हैं?

  1. नियंत्रक
  2. एक देखें मॉडल निर्माता का उपयोग करके और डोमेन मॉडल पारित (अच्छा नहीं है, मैं अपने नियंत्रक स्लिम रखना चाहते हैं) से आबाद देखें मॉडल सीधे : मैं तीन संभावित तरीकों के बारे में सुना पैरामीटर के रूप में। (मुझे प्रत्येक डोमेन मॉडल क्लास के लिए एक कन्स्ट्रक्टर बनाना है जिसे मैं उपयोग करना चाहता हूं)
  3. भरें() विधि का उपयोग करके। (मैंने इसे वेब पर देखा, कोई विचार नहीं कि यह कैसे काम करता है मुझे लगता है कि ViewModel को सेवा परत से अवगत होना चाहिए और युग्मन बनाता है)।

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

+0

ऐसा लगता है कि आपने वहां अपने स्वयं के प्रश्न का उत्तर दिया है। – dice

+1

खुशी है कि आपने यह पूछा है, मुझे आश्चर्य है कि किसी ने इस प्रश्न को +1 नहीं किया है जैसे कि उन्होंने इसे वापस किया था। मैं विभिन्न सुझावों और प्रस्तावित प्रथाओं के साथ झुका रहा हूं लेकिन डार्न्स का जवाब मेरी सड़क, अच्छा सवाल, महान जवाब है। – LenPopLilly

उत्तर

27

विचार यह है कि आपका नियंत्रक कार्रवाई डोमेन मॉडल लाने के लिए कुछ भंडार पूछताछ करता है। तो यह एक मानचित्रण परत है जो इसे एक दृश्य के मॉडल को बदलने के लिए जिम्मेदार है करने के लिए इस डोमेन मॉडल से गुजरता है और अंत में यह देखने के लिए दृश्य मॉडल गुजरता है:

public ActionResult Index(int id) 
{ 
    ProductInfo product = repository.GetProductInfo(id); 
    ProductViewModel viewModel = Mapper.Map<ProductInfo, ProductViewModel>(product); 
    return View(viewModel); 
} 

और तुम भी एक कस्टम शुरू करने से अपने नियंत्रक स्लिमर कर सकता है कार्रवाई फिल्टर है कि स्वचालित रूप से OnActionExecuted घटना में मॉडल रोकना और मानचित्रण परत में फोन इसी दृश्य मॉडल के साथ यह विकल्प ताकि आपके नियंत्रक कार्रवाई अब हो जाता है:

[AutoMapTo(typeof(ProductViewModel))] 
public ActionResult Index(int id) 
{ 
    ProductInfo product = repository.GetProductInfo(id); 
    return View(product); 
} 

और निश्चित रूप से अब दृश्य दृढ़ता से लिखा गया ProductViewModel पर:

@model ProductViewModel 
... 

Mapper.Map<TSource, TDest> विधि को लागू करने के लिए आप पर निर्भर करता है। और यदि आप इसे स्वयं लागू नहीं करना चाहते हैं तो आप AutoMapper डाउनलोड कर सकते हैं जो आपके पास पहले से ही यह तरीका है।

मानचित्रण परत कुछ ऐसा है जो एमवीसी अनुप्रयोग का हिस्सा है। यह मैपिंग करने में सक्षम होने के लिए आपकी सेवा परत से आने वाले डोमेन मॉडल और आपके एमवीसी अनुप्रयोग में परिभाषित दृश्य मॉडल दोनों से अवगत होना चाहिए।

अपने दृश्य मॉडल में रचनाकारों (डिफ़ॉल्ट पैरामीटर रहित के अलावा) का उपयोग न करें। डिफ़ॉल्ट मॉडल बाइंडर चकित होगा यदि दृश्य मॉडल में आपके POST कार्यों में पैरामीटर रहित कन्स्ट्रक्टर नहीं है और आपको कस्टम मॉडल बाइंडर्स को लागू करना होगा।

+0

हमेशा के रूप में आश्चर्यजनक रूप से स्पष्ट और पूर्ण। बहुत धन्यवाद! – CiccioMiami

+0

वास्तव में अच्छा जवाब :) –

+0

वैसे, आप मानचित्रण को कहां कॉन्फ़िगर करते हैं (यानी Mapper.CreateMap () ...)? – Abe

1

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

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