2010-04-06 20 views
5

मैं एक ऐसे वस्तु का उपयोग कर रहा हूं जो मेरे रूप में सभी फ़ील्ड से मेल खाता हो। मैं फिर अपनी क्रिया में वस्तु को पॉप्युलेट करने के लिए डिफ़ॉल्ट बाइंडिंग का उपयोग करता हूं, इस तरह;एमवीसी बाध्यकारी फॉर्म डेटा समस्या

public ActionResult GetDivisionData(DivisionObj FormData) 

मेरा डिवीजन ओबज कन्स्ट्रक्टर में स्ट्रिंग.empty के सभी मूल्यों को आरंभ करता है।

समस्या यह है कि जब बाइंडर पोस्ट किए गए फॉर्म डेटा से मॉडल को पॉप्युलेट करता है, तो पोस्ट किए गए किसी भी डेटा को ऑब्जेक्ट में शून्य पर सेट नहीं किया जाता है, हालांकि मैंने ऑब्जेक्ट को रिक्त तार रखने के लिए प्रारंभ किया था।

क्या इसे बदलने का कोई तरीका है ताकि पोस्ट न किए गए डेटा खाली स्ट्रिंग हों।

+0

आपको अपने कंट्रोलर एक्शन में रिक्त स्ट्रिंग्स पर गुण सेट करने की आवश्यकता होगी, इसे अपने बिजनेस लॉजिक या डेटा एक्सेस लेयर में संभालें। मेरा सुझाव है कि यह आपके बीएल के लिए एक समारोह था। – Lazarus

उत्तर

13

यह डिफॉल्टमोडेल बाइंडर का डिफ़ॉल्ट व्यवहार है, विशेष रूप से डेटाअनोटेशन फ्रेमवर्क। ConvertEmptyStringToNull डिफ़ॉल्ट रूप से, सत्य पर सेट है। आप अपना खुद का मॉडल बाइंडर बना सकते हैं और डिफ़ॉल्ट मॉडल बाइंडर को प्रतिस्थापित कर सकते हैं।

public class EmptyStringModelBaseBinder : DefaultModelBinder 
{ 
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     bindingContext.ModelMetadata.ConvertEmptyStringToNull = false; 

     return base.BindModel(controllerContext, bindingContext); 
    } 
} 
वैश्विक में

फिर ...

ModelBinders.Binders.DefaultBinder = new EmptyStringModelBaseBinder(); 

हालांकि मैं इच्छा है कि वे डिफ़ॉल्ट modelbinder के लिए इस की स्थापना के लिए एक स्थिर तरीका था। शायद v3 में :)

वैकल्पिक रूप से, आप प्रति-संपत्ति के आधार पर इसे सेट करने के लिए [DisplayFormat(ConvertEmptyStringToNull=false)] विशेषता का भी उपयोग कर सकते हैं।

2

तुम हमेशा [Bind(Exclude="PropertyName1,PropertyName2,PropertyName3")] बंधन से कुछ गुण बाहर करने के लिए उपयोग कर सकते हैं:

public ActionResult GetDivisionData([Bind(Exclude="PropertyName1,PropertyName2,PropertyName3")]DivisionObj FormData) 

तुम सच में स्ट्रिंग के गुणों में String.Empty करना होगा, तो आप इस बांधने की मशीन का उपयोग कर सकते हैं:

public class EmptyStringModelBinder : DefaultModelBinder 
{ 
    protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor) 
    { 
     base.BindProperty(controllerContext, bindingContext, propertyDescriptor); 
     if (propertyDescriptor.PropertyType == typeof(String)) 
      propertyDescriptor.SetValue(bindingContext.Model,propertyDescriptor.GetValue(bindingContext.Model) ?? String.Empty); 
    } 
} 

आप इसे ग्लोबल.एक्सएक्स में भी चलाने की ज़रूरत होगी:

ModelBinders.Binders.DefaultBinder = new EmptyStringModelBinder(); 
+0

तब यह अधिक गतिशील है। मेरा उपयोगकर्ता फॉर्म गलत भर सकता है। बिंदु है कि अगर मुझे फ़ील्ड खाली छोड़ दिया गया तो स्ट्रिंग.empty रखने के लिए मुझे अपनी ऑब्जेक्ट की आवश्यकता है। – John

1

मैं केवल confi आरएम कि मैं आपके जैसा ही परिणाम देखता हूं। आपके विकल्प हैं:

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

मैं वर्तमान में विभिन्न कस्टम गुणों के साथ कई मुद्दों को रखने की प्रक्रिया में हूं, कुछ जिन्हें रचनाकारों में तत्काल स्थापित करने की आवश्यकता है, कुछ जिन्हें केवल रनटाइम पर जाना जाता है और अन्य जो विशेष हैं किसी तरह।

मैंने यह निर्धारित किया है कि मेरे लिए कस्टम मॉडल बाइंडर के साथ जाना सबसे अच्छा है और इनमें से अधिकांश चीजें हैं।

+0

तो आप कह रहे हैं कि डिफ़ॉल्ट मॉडल बाइंडर ऑब्जेक्ट वैल्यू को शून्य बना देगा, यदि पोस्ट डेटा में मिलान करने वाला मान नहीं मिला है, भले ही ऑब्जेक्ट स्ट्रिंग.empty में प्रारंभ किया गया हो? – John

+0

मैंने इसे आजमाया क्योंकि जब मैंने आपके प्रश्न का उत्तर दिया तो मेरे पास कुछ कोड था और यह जिस तरह से आप अनुभव कर रहे हैं उस पर काम किया। लेकिन अगर मैं हमेशा ऐसा काम करता हूं तो मुझे 100% यकीन नहीं है। आप एएसपी.नेट एमवीसी स्रोत को स्वयं डाउनलोड कर सकते हैं और DefaultValueProvider और DefaultModelBinder कार्यान्वयन को देख सकते हैं और स्वयं को देख सकते हैं कि वे इसे कैसे करते हैं। – mare

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