2009-04-03 10 views
7

मैं एक कस्टम मॉडल बाइंडर लिखने की कोशिश कर रहा हूं लेकिन जटिल जटिल वस्तुओं को बांधने के तरीके को समझने में मुझे बड़ी कठिनाई हो रही है।कॉम्प्लेक्स समग्र ऑब्जेक्ट्स के लिए कस्टम मॉडल बाइंडर सहायता

इस

वर्ग मैं करने के लिए बाध्य करने के लिए कोशिश कर रहा हूँ है:

public class Fund 
{ 
     public int Id { get; set; } 
     public string Name { get; set; } 
     public List<FundAllocation> FundAllocations { get; set; } 
} 

और यह कैसे कस्टम बांधने की मशीन लेखन में मेरी प्रयास लग रहा है जैसे:

public class FundModelBinder : IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     throw new NotImplementedException(); 
    } 

    public object GetValue(ControllerContext controllerContext, string modelName, Type modelType, ModelStateDictionary modelState) 
    { 
     var fund = new Fund(); 

     fund.Id = int.Parse(controllerContext.HttpContext.Request.Form["Id"]); 
     fund.Name = controllerContext.HttpContext.Request.Form["Name"]; 

     //i don't know how to bind to the list property :(
     fund.FundItems[0].Catalogue.Id = controllerContext.HttpContext.Request.Form["FundItem.Catalogue.Id"]; 
     return fund; 
    } 
} 

किसी भी विचार

धन्यवाद टोनी

+0

मैंने अभी एक प्रश्न पोस्ट किया है और फिर अंततः इस तरह के मुद्दे के समाधान का पता लगाया। रुचि रखने वालों के लिए, आप नीचे दिए गए लिंक को देखना चाह सकते हैं: [http://stackoverflow.com/questions/1077481/how-do-i-pass-a-dictionary-as-a-parameter-to-an-actionresult -method-से-jQuery-एक] (http://stackoverflow.com/questions/1077481/how-do-i-pass-a-dictionary-as-a-parameter-to-an-actionresult-method-from- jquery-a) –

उत्तर

3

मैं इस सटीक पर बहुत अधिक खर्च कर रहा हूं हाल ही में एमी बात!

अपने HTML फ़ॉर्म को देखकर बिना, मैं अनुमान लगा रहा हूँ कि यह सिर्फ एक बहु चयन सूची या कुछ और से चयन के परिणाम लौटा रहा है? यदि ऐसा है, तो आपका फॉर्म सिर्फ आपके हाइड्रेटेड FundAllocations ऑब्जेक्ट को वापस करने के बजाय पूर्णांक का एक गुच्छा लौटा रहा है। यदि आप ऐसा करना चाहते हैं, तो अपने कस्टम मॉडलबिन्डर में, आपको अपना खुद का लुकअप करने और ऑब्जेक्ट को हाइड्रेट करने की आवश्यकता होगी।

कुछ की तरह:

fund.FundAllocations = 
     repository.Where(f => 
     controllerContext.HttpContext.Request.Form["FundItem.Catalogue.Id"].Contains(f.Id.ToString()); 
बेशक

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

नवीनतम Herding Code podcast इस का एक बड़ा चर्चा के रूप में K Scott Allen's Putting the M in MVC blog posts हो रहा है।

8

क्या आपको वाकई कस्टम मॉडलबिन्डर को कार्यान्वित करने की आवश्यकता है? डिफ़ॉल्ट बांधने की मशीन है कि तुम क्या जरूरत है (के रूप में यह संग्रह और जटिल वस्तुओं को पॉप्युलेट कर सकते हैं) कर सकते हैं:

चलें कहना अपने नियंत्रक कार्रवाई इस तरह दिखता है:

public ActionResult SomeAction(Fund fund) 
{ 
    //do some stuff 
    return View(); 
} 

और आप एचटीएमएल यह शामिल हैं:

<input type="text" name="fund.Id" value="1" /> 
<input type="text" name="fund.Name" value="SomeName" /> 

<input type="text" name="fund.FundAllocations.Index" value="0" /> 
<input type="text" name="fund.FundAllocations[0].SomeProperty" value="abc" /> 

<input type="text" name="fund.FundAllocations.Index" value="1" /> 
<input type="text" name="fund.FundAllocations[1].SomeProperty" value="xyz" /> 

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

+0

जोनोवा - क्या आपके पास मानक मॉडल बाइंडर के लिए अच्छा प्रलेखन का लिंक है, या आपने स्रोत को देखा है? –

+0

, क्षमा करें, किसी भी ऑफिकल दस्तावेज़ीकरण के लिए कोई लिंक नहीं है, मैं वास्तव में अपने ब्लॉग पर फिल हैक की सलाह पर जा रहा था, क्योंकि मुझे एक ही समस्या थी - http://haacked.com/archive/2008/10 /23/model-binding-to-a-list.aspx। 1.0 में ऐसा करने का एक बेहतर तरीका हो सकता है, सुनिश्चित नहीं है ... – JonoW

+0

वह सही है, आपको कस्टम मॉडल बाइंडर की आवश्यकता नहीं है। आप उपरोक्त प्रदर्शन के रूप में नाम फ़ील्ड में हेरफेर करके ऐसा कर सकते हैं। – MedicineMan

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