2009-04-19 17 views
8

मैं एक कस्टम ViewModel के रूप में परिभाषित किया है:MVC कस्टम ViewModel और ऑटो बाध्यकारी

:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(SampleFormViewModel model) 
{ 

संपादित करें फार्म के रूप में सेट किया गया है:

public class SampleFormViewModel 
{ 
    public SampleFormViewModel(SelectList companies, Widget widget) 
    { 
     Companies = companies; 
     Widget = widget; 
    } 

    public SelectList Companies { get; private set; } 
    public Widget Widget { get; private set; } 
} 

मेरी संपादित पोस्ट हैंडलर में मैं निम्नलिखित प्रविष्टि

Inherits="System.Web.Mvc.ViewPage<Sample.Web.Models.SampleFormViewModel>" 

और यह अभी तक उड़ाता है, सुनिश्चित नहीं है कि क्या हो रहा है, निम्न त्रुटि है: कोई पी नहीं इस वस्तु के लिए परिभाषित arameterless कन्स्ट्रक्टर। निश्चित रूप से मैं यहां कुछ वास्तव में स्पष्ट याद कर रहा हूं। कुछ पृष्ठभूमि, जीईटी पूरी तरह से काम करता है और अपेक्षित के रूप में selectList से ड्रॉपडाउन प्रदर्शित करता है। मैं कस्टम व्यू मॉडल पर ऑटो बाध्यकारी वापस अनुमान लगा रहा हूं कि असफल रहा है लेकिन यह सुनिश्चित नहीं है कि इसके बारे में क्या करना है।

+0

आप जिस फ़ॉर्म को पोस्ट कर रहे हैं वह कैसा दिखता है? –

उत्तर

8

आपको पैरामीटर रहित कन्स्ट्रक्टर होना चाहिए और मुझे विश्वास है कि गुणों को सार्वजनिक सेटर्स की आवश्यकता है। डिफ़ॉल्ट बाइंडर उस कन्स्ट्रक्टर का उपयोग करके ऑब्जेक्ट बनाता है जो कोई पैरामीटर नहीं लेता है, फिर फॉर्म/क्वेरी पैरामीटर से मान सेट करने के लिए सार्वजनिक गुणों पर प्रतिबिंब का उपयोग करता है।

public class SampleFormViewModel 
{ 
    public SampleFormViewModel() { } 

    public SelectList Companies { get; set; } 
    public Widget Widget { get; set; } 
} 

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

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(int CompanyID, Widget widget) 
{ 
} 
+0

हाँ, मुझे अब मिल गया है। समस्या यह थी कि SelectList में कोई पैरामीटर रहित कन्स्ट्रक्टर नहीं है। यदि मैं निर्माता से चयनसूची (कंपनियों) को हटा देता हूं। और जब मैं ViewModel बनाता हूं तो यह फ्लाई (विजेट ऑब्जेक्ट में जानकारी से) पर बनाता है, यह सभी अपेक्षित काम करता है। केवल अंतर यह है कि मैं इसे POST में कैसे संभालता हूं, हस्ताक्षर अब है: सार्वजनिक एक्शन रीसेट संपादित करें (int id, formCollection formValues) –

2

एमवीसी दृढ़ता से टाइप किए गए विचारों पर, आवश्यक है कि दृश्य उस दृश्य पर उपयोग की जाने वाली कक्षा बना सकता है। इसका मतलब किसी भी पैरामीटर के बिना एक कन्स्ट्रक्टर है। और यह समझ में आता है। एमवीसी के लिए नए लोग इसी तरह के "हुह" देखेंगे? समस्याएं जब वे सार्वजनिक रूप से पैरामीटर बनाने में विफल/विफल होती हैं और ऐसी सभी संबंधित त्रुटियां जो पॉपअप को स्वयं को एक साथ रखने का प्रयास करती हैं (एक कंपाइलर त्रुटि के विपरीत)।

लेकिन पैरामीटर रहित कन्स्ट्रक्टर समस्याओं के इस वर्ग में "दिलचस्प" क्या है जब आपकी कक्षा की एक संपत्ति में पैरामीटर-मुक्त कन्स्ट्रक्टर भी नहीं होता है। मुझे लगता है कि यह निराशावादी दृष्टिकोण है?

चयनसूची वर्ग पर कुछ सीखने का समय बिताए - एमवीसी के लिए विशिष्ट वर्ग - मैं कुछ लोगों को कुछ मिनट/घंटे बचाने में मदद करना चाहता था।

यह वास्तव में महत्वपूर्ण उपकरण/ड्रॉपडाउन सूची निर्माण के लिए वर्ग, निम्न कंस्ट्रक्टर्स है:

सार्वजनिक selectList (IEnumerable आइटम); सार्वजनिक चयनसूची (IENumerable आइटम, ऑब्जेक्ट चयनित वैल्यू); सार्वजनिक चयनसूची (IENumerable आइटम, स्ट्रिंग डेटा ValueField, स्ट्रिंग डेटाTextField); सार्वजनिक चयनसूची (IENumerable आइटम, स्ट्रिंग डेटा ValueField, स्ट्रिंग डेटाTextField, ऑब्जेक्ट चयनित Value);

.. और इसलिए, यदि ये आपकी कक्षा (दृश्य के लिए उपयोग किए जाने वाले) पर गुण हैं, तो एमवीसी आपको छद्म "कोई पैरामीटर रहित कन्स्ट्रक्टर" त्रुटि प्रदान नहीं करेगा।

लेकिन, यदि आप एक सहायक वर्ग की तरह कुछ बनाते हैं, तो अपनी मूल कक्षा से सटीक कोड काट-एन-पेस्ट करें, और फिर उस सहायक वर्ग को अपनी मूल कक्षा पर एक पैरामीटर (प्राप्त करें/सेट नहीं) करें; आप जाने के लिए अच्छे हैं।

और इस तरह, आप प्राप्त और पदों के लिए एक दृश्य का उपयोग कर सकते हैं।जो अधिक सुंदर है :)

व्यक्तिगत रूप से, मैंने या तो मजबूत टाइप किए गए विचारों के संगठनों और आवश्यकताओं को पहचानने के लिए संकलक बनाया होगा, या ड्रॉपडाउन (या सिलेक्टलिस्ट का अन्य "ग्राहक") को काम करने में असफल होने दें तो आश्चर्य कीजिए कि क्या पैरामीटरलेस कन्स्ट्रक्टर पर रिकर्सिव जांच का एक विशिष्ट स्तर है।

शुक्र है, वर्तमान संस्करण केवल शीर्ष स्तर के लिए प्रतीत होता है। एक हैक की तरह लगता है और मुझे उम्मीद है कि यह डिजाइन द्वारा है।

एचटीएच।

+1

क्या आप चयन सूचियों के लिए सहायक वर्ग के बारे में बयान विस्तृत कर सकते हैं ?, शायद कोड उदाहरण के साथ? – camainc

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