16

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

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

क्या किसी को कुछ अद्यतित ट्यूटोरियल पता है जो मुझे कस्टम मॉडल बाइंडर बनाने के साथ शुरू कर सकता है?

उत्तर

12

मुझे नहीं पता कि क्यों आप सोचते हैं कि एमवीसी 1 कस्टम मॉडल बाइंडर्स के संबंध में बहुत कुछ बदल गया है। लेकिन अगर मैं समझता हूं कि आप क्या करने की कोशिश कर रहे हैं, तो यह काफी आसान होना चाहिए।

public class CustomModelBinder : DefaultModelBinder { 
    public override object BindModel(ControllerContext controllerContext, 
     ModelBindingContext bindingContext) { 

     NameValueCollection form = controllerContext.HttpContext.Request.Form; 
     //get what you need from the form collection 

     //creata your model 
     SomeModel myModel = new SomeMode(); 
     myModel.Property = "value"; 
     //or add some model errors if you need to 
     ModelStateDictionary mState = bindingContext.ModelState; 
     mState.Add("Property", new ModelState { }); 
     mState.AddModelError("Property", "There's an error."); 

     return myModel; //return your model 
    } 
} 

और अपनी कार्रवाई:

public ActionResult Contact([ModelBinder(typeof(CustomModelBinder))]SomeModel m){ 
    //... 
} 

था कि जानकारी के प्रकार आप के लिए देख रहे हैं?

+2

यह तकनीक पूरी तरह से मेरे लिए काम करती है, लेकिन मुझे लगता है कि मुझे HttpContext को सीधे (टेस्टेबिलिटी कारणों के लिए) तक पहुंचने के बजाय 'बाध्यकारी कॉन्टेक्स्ट.वेल्यूप्रोवाइडर' का उपयोग करना चाहिए। –

+0

@ नेथन टेलर, मैं देखता हूं। उस स्थिति में, यहां वर्णित तकनीक आपको शुरू कर सकती है। http://www.hanselman.com/blog/SplittingDateTimeUnitTestingASPNETMVCCustomModelBinders.aspx एस हंसेलमैन यहां एक उदाहरण प्रदान करता है कि बाइंडर का परीक्षण कैसे करें: http://stackoverflow.com/questions/253574/how-to-test-custom -मोडेल-बाइंडर्स-इन-एएसपी-नेट-एमवीसी/589250 # 589250 –

+0

इसके अलावा, यदि आप एक विशिष्ट (या जेनेरिक) प्रकार के आधार पर मॉडल बाइंडिंग करने की तलाश में हैं, तो यहां पोस्ट देखें: http://stackoverflow.com/प्रश्न/1487005/एएसपी-नेट-एमवीसी-मॉडल-बाइंडर-जेनेरिक-प्रकार –

1

मेरे ब्लॉग पर Custom MVC Model binders के कई उदाहरण देखें।

+1

वेबसाइट नीचे है और उदाहरण यहां पोस्ट किए जाने चाहिए - बाहरी साइट नहीं। –