2009-06-09 19 views
36

बाइंडिंग मैं है एक प्रकार:ASP.NET MVC - मिश्रण कस्टम और डिफ़ॉल्ट मॉडल

public class IssueForm 
{ 
    Order Order {get; set;} 
    Item Item {get; set;} 
    Range Range {get; set;} 
} 

मैं कस्टम मॉडल बांधने की मशीन बनाई आदेश और आइटम पर आवश्यकताओं के कारण है, लेकिन अभी भी रेंज डिफ़ॉल्ट मॉडल बाइंडर इस्तेमाल कर सकते हैं।

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


संपादित

पहली टिप्पणी और जवाब को देखते हुए - यह डिफ़ॉल्ट मॉडल बांधने की मशीन से इनहेरिट उपयोगी हो सकता है की तरह लगता है।

मेरी सेटअप के लिए अधिक विशिष्ट जानकारी को जोड़ने के लिए अब तक मेरे पास है:

public IssueFormModelBinder : IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     Order = //code to pull the OrderNumber from the context and create an Order 
     Item = //code to pull the ItemNumber from the context and create an Item 

     IssueForm form = IssueFormFactory.Create(Order, Item); 

     form.Range = // ** I'd like to replace my code with a call to the default binder ** 

     return form 
    } 
} 

यह बात करने का एक बेवकूफ तरीका हो सकता है ... यह मेरा पहला मॉडल बांधने की मशीन है। बस मेरे वर्तमान कार्यान्वयन को इंगित करना।


संपादित करें # 2

तो जवाब ओवरराइड करने के लिए अगर मैं की तरह एक "मैं सभी बाध्यकारी किया हूँ" विधि में हुक और गुणों के साथ फैक्टरी विधि कॉल कर सकते हैं BindProperty काम करेंगे।

मुझे लगता है कि मुझे वास्तव में डिफॉल्टमोडेल बाइंडर कार्यान्वयन को देखना चाहिए और बेवकूफ होना छोड़ देना चाहिए। DefaultModelBinder से

public class CustomModelBinder : DefaultModelBinder { 
    protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor) { 
     if(propertyDescriptor.Name == "Order") { 
      ... 
      return; 
     } 

     if(propertyDescriptor.Name == "Item") { 
      ... 
      return; 
     } 

     base.BindProperty(controllerContext, bindingContext, propertyDescriptor); 
    } 

} 
+1

मुझे यकीन नहीं है कि यह सबसे सुरुचिपूर्ण समाधान है, लेकिन क्या आप IModelBinder को लागू करने के बजाय डिफ़ॉल्ट मॉडेल बाइंडर से अपना कस्टम मॉडल बाइंडर प्राप्त कर सकते हैं? फिर जब आप BindModel को ओवरराइड करते हैं, तो जिम्मेदारी को डिफ़ॉल्ट मॉडेलबिन्डर से पास करें जहां उचित हो। अन्यथा, कस्टम बाध्यकारी का उपयोग करें। –

+0

याहू, मैं कुछ मॉडल बाइंडर्स को IModelBinder और DefaultModelBinder से बाहर देख रहा हूं। मुझे लगता है कि DefaultModelBinder में कुछ अतिरिक्त विधियां हैं जो मुझे लगता है कि यह BindModel विधि से कॉल करता है, ताकि आप अपनी आवश्यकताओं को और अधिक केंद्रित कर सकें? – anonymous

+0

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

उत्तर

24

कुछ इस तरह का प्रयास करें

public class CustomModelBinder:DefaultModelBinder 
     { 
      protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor) 
      { 
       if (propertyDescriptor.PropertyType == typeof(Range)) 
       { 
        base.BindProperty(controllerContext, bindingContext, propertyDescriptor); 
       } 
       // bind the other properties here 
      } 
     } 
+0

मैं यहां बेवकूफ होने की संभावना है लेकिन आप कस्टममोडेल बाइंडर क्लास को कैसे कार्यान्वित करते हैं, निश्चित रूप से इसे काम करने के लिए कहीं भी तत्काल होना चाहिए? शायद ActionResult पैरा में एक विशेषता के रूप में? –

49

ओवरराइड BindProperty:

+20

+1 नाम के बजाय संपत्ति प्रकार को inspedcting के लिए +1। जादू जादू तार! –

6

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

+4

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

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