2010-02-11 4 views
9

पर बाइंडप्रोपर्टी और सेटप्रोपर्टी के बीच क्या अंतर है, मैं एक एमवीसी एप्लिकेशन में एक कस्टम मॉडल बाइंडर बना रहा हूं और मैं एक स्ट्रिंग को एक गणना मूल्य में पार्स करना चाहता हूं और इसे मॉडल प्रॉपर्टी में असाइन करना चाहता हूं। मुझे BindProperty विधि को ओवरराइड करने में काम मिल गया है, लेकिन मैंने यह भी देखा कि SetProperty विधि है।आईमोडेल बाइंडर

protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor) 
    { 
     switch (propertyDescriptor.Name) 
     { 
      case "EnumProperty": 
       BindEnumProperty(controllerContext, bindingContext); 
       break; 
     } 

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

    private static void BindEnumProperty(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var formValue = controllerContext.HttpContext.Request.Form["formValue"]; 

     if (String.IsNullOrEmpty(formValue)) 
     { 
      throw new ArgumentException(); 
     } 

     var model = (MyModel)bindingContext.Model; 
     model.EnumProperty = (EnumType)Enum.Parse(typeof(EnumType), formValue); 
    } 

मुझे यकीन नहीं है कि दोनों के बीच क्या अंतर है और क्या मैं इसे अनुशंसित तरीके से कर रहा हूं।

उत्तर

6

सबसे पहले, बाइंडप्रोपर्टी IModelBinder का हिस्सा नहीं है, लेकिन डिफॉल्टमोडेल बाइंडर में एक संरक्षित विधि है। आप केवल तभी एक्सेस कर सकते हैं जब आप डिफॉल्टमोडेल बाइंडर को उप-वर्गीकृत कर रहे हों।

निम्नलिखित बातों आपके प्रश्न का उत्तर चाहिए:

  • BindProperty IModelBinder इंटरफ़ेस यह propertyDescriptor तर्क के PropertyType से हो जाता है का उपयोग करता है। यह आपको गुणों को मेटाडेटा में कस्टम गुणों को इंजेक्ट करने की अनुमति देता है।
  • बाइंडप्रोपर्टी ठीक से सत्यापन संभालती है। यह (12) सेटप्रोपर्टी विधि केवल तभी कॉल करता है जब नया मान मान्य है।

तो यदि आप उचित सत्यापन (एनोटेशन विशेषताओं का उपयोग करके) चाहते हैं तो आपको निश्चित रूप से बाइंडप्रोपर्टी को कॉल करना होगा। SetProperty को कॉल करके आप सभी अंतर्निहित सत्यापन तंत्र को बाईपास करते हैं।

आपको DefaultModelBinder का स्रोत कोड देखना चाहिए, प्रत्येक विधि क्या करती है, क्योंकि इंटेलिजेंस केवल सीमित जानकारी प्रदान करता है।

+0

स्रोत अमान्य कैसे http://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Mvc/DefaultModelBinder.cs – Rob

+0

@Rob आपके URL में –

+0

@Kilanny अमान्य है पर अब है? यह अभी भी मेरे लिए काम करता प्रतीत होता है। – Rob

0

मुझे लगता है कि सेटप्रोपर्टी अंतिम पैरामीटर के रूप में सेट करने के लिए वास्तविक मान लेता है।