2011-06-21 12 views
6

मुझे उम्मीद है कि मुझे यहां कुछ अविश्वसनीय रूप से स्पष्ट नहीं दिख रहा है, लेकिन क्या कोई कारण है कि मॉडल बाइंडर को हमेशा एक संग्रह मॉडल को बाध्य करने में परेशानी होती है जो संग्रह से प्राप्त होती है?एमवीसी 3 रेजर मॉडल बाइंडर और विरासत संग्रह

आइए कहें कि मैं एक पेजेड सूची दिखाना चाहता हूं और कॉम्बो बॉक्स प्रदर्शित करना चाहता हूं और इसके ऊपर बटन जोड़ना चाहता हूं (सरल सूचियों से निपटना)। शामिल वर्गों की तरह दिखेगा:

public class PagedList<T> : List<T> 
{ 
    public int TotalCount { get; set; } 
} 

और फिर एक दृश्य के मॉडल है कि तरह लग रहा है: तो ध्यान में रखते हुए

public class MyViewModel : PagedList<ConcreteModel> 
{ 
    public IEnumerable<ChildModel> List { get; set; } 
    public int? SelectedChildModelId { get; set; } 
} 

(उस्तरा):

@model MyViewModel 
@using (Html.BeginForm()) 
{ 
    @Html.DropDownListFor(model => model.SelectedChildModelId, new SelectList(Model.List, "ChildModelId", "DisplayName")) 
} 

और नियंत्रक HttpPost कार्रवाई:

public ActionResult(MyViewModel viewModel) 
{ 
    ... 
} 

उपरोक्त सी Ause ViewModel ActionResult में शून्य होने के लिए। क्या इसके लिए एक तार्किक स्पष्टीकरण है? जो मैं बता सकता हूं उससे संग्रह केवल उन मॉडलों को देखने के लिए विशिष्ट है जो संग्रह से प्राप्त होते हैं।

मुझे पता है कि मैं इसे कस्टम बांधने की मशीन के साथ प्राप्त कर सकता हूं लेकिन इसमें शामिल संपत्तियां प्राचीन प्रकार हैं और यहां तक ​​कि कोई भी जेनरिक या विरासत भी नहीं है।

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

+0

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

+0

[स्टैक ओवरलो] पर जवाब (http://stackoverflow.com/questions/5762302/why-cant-my-views-model-bind-with-my-generic-viewmodel-which-implements-an-inte) दिखता है होनहार। हमम, कॉन्वेंट्स - –

उत्तर

0

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

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

http://www.nickriggs.com/posts/post-complex-javascript-objects-to-asp-net-mvc-controllers/

+1

धन्यवाद डेविन से पहले कभी नहीं इस्तेमाल किया। निश्चित रूप से एक दिलचस्प प्लगइन लेकिन इस मामले में जावास्क्रिप्ट के साथ इसका कोई संबंध नहीं है। आम तौर पर मैं चाहता हूं कि मेरे सभी वेब ऐप्स जावास्क्रिप्ट के बिना काम करें और केवल इसे बढ़ाने के रूप में उपयोग करें। इस मामले में यह एमवीसी 3 की आपूर्ति की गई बाइंडर्स का मामला नहीं है जो संग्रह मॉडल पदों के साथ काम करना है।जो मैं खोज रहा था वह दृश्य मॉडल को व्यवस्थित करने या सही आधार संग्रह से प्राप्त करने का एक तरीका है कि यह सही ढंग से बाध्य है। –

1

अपने ही सवाल का जवाब करने के लिए। यह काफी बेहतर है क्योंकि जब प्रतिपादन आप

@Html.EditorFor(m => m.CollectionProperty) 

का उपयोग और निहित प्रकार के लिए के तहत दृश्य/साझा/EditorTemplates एक कस्टम संपादक बना सकते हैं काम करता है। यह मॉडल बाइंडर के साथ खूबसूरती से काम करता है क्योंकि संग्रह से सभी अलग-अलग आइटम एक इंडेक्स प्राप्त करते हैं और बाइंडर जमा होने पर ऑटो बाध्य करने में सक्षम होता है।

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