2009-07-30 17 views
6

में UpdateModel पर काम करने वाली शामिल प्रॉपर्टी नहीं मिल पा रहे हैं क्या किसी के पास इसके साथ भाग्य है?एएसपी.नेट एमवीसी

var myModel = getCurrentModelFromDb(id); 
UpdateModel(myModel, "ModelName", new string { "Name", "Details" }); 

चाहिए इस केवल अद्यतन:

public string Name { get; set; } 
public string Details { get; set; } 
public DateTime? Created { get; set; } 

और उसके बाद मैं एक प्रदर्शन:

कृपया मुझे बताएं कि मैं इसे सही ढंग से समझ, अगर मैं एक साधारण मॉडल है चलो कहते हैं कि के साथ करने देते हैं नाम और विस्तार गुण? क्योंकि मान लीजिए कि 'बनाई गई' में डीबी से पहले से ही कोई तारीख थी, जब मैं उपरोक्त करता हूं तो ऐसा लगता है कि मेरी बनाई गई तिथि मूल से 01-01-0001 पर सेट हो गई है।

यही नहीं, जब मैं तो स्पष्ट रूप से इस क्षेत्र को बाहर करने के लिए प्रयास करें:

UpdateModel(myModel, "ModelName", 
    new string { "Name", "Details" }, new string { "Created" }); 

यह अभी भी 01-01-0001 करने के लिए सेट किया जा रहा है। क्या यह एक बग है, या एक अजीब बात है कि मैं गलत कर रहा हूँ?

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

मैं कहूंगा कि शायद ऊपर और मेरे असली दुनिया परिदृश्य के बीच एकमात्र अंतर है, मैं एक सूची में अद्यतन मॉडल का उपयोग कर रहा हूं, इसलिए मैं प्रभावी रूप से सूची प्राप्त कर रहा हूं FromDb (parentId) और फिर अद्यतन मॉडल (myList, "ListPrefix") लागू कर रहा हूं। उस पर जो प्रत्येक आइटम को [0], [1] आदि द्वारा उठाता है ... यह काम करता है, क्योंकि सभी नाम अपडेट हो रहे हैं, लेकिन बाकी सब कुछ नहीं है।

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

उत्तर

1

मैं इस परावर्तक का उपयोग कर में देख रहा है ... कॉल स्टैक है:

UpdateModel() ->TryUpdateModel() ->DefaultModelBinder.BindModel() ---> या तो BindComplexModel() या BindSimpleModel()

if (bindingContext.ModelType != typeof(string)) 
    { 
     if (bindingContext.ModelType.IsArray) 
     { 
      return ConvertProviderResult(bindingContext.ModelState, bindingContext.ModelName, valueProviderResult, bindingContext.ModelType); 
     } 
     Type type = ExtractGenericInterface(bindingContext.ModelType, typeof(IEnumerable<>)); 
     if (type != null) 
     { 
      object o = this.CreateModel(controllerContext, bindingContext, bindingContext.ModelType); 
      Type collectionType = type.GetGenericArguments()[0]; 
      Type destinationType = collectionType.MakeArrayType(); 
      object newContents = ConvertProviderResult(bindingContext.ModelState, bindingContext.ModelName, valueProviderResult, destinationType); 
      if (typeof(ICollection<>).MakeGenericType(new Type[] { collectionType }).IsInstanceOfType(o)) 
      { 
       CollectionHelpers.ReplaceCollection(collectionType, o, newContents); 
      } 
      return o; 
     } 
    } 

यह बिल्कुल साफ नए तत्व बनाया जा रहा देखते हैं कि बताया गया है:

यहाँ BindSimpleModel() के लिए disassembly है। हालांकि मैं झंडे के सटीक तर्क के बारे में अस्पष्ट हूं, और मेरे पास अभी इसकी जांच करने का समय नहीं है। संयोग से, BindComplexModel समान है कि ऐसा लगता है कि यह संग्रह प्रकारों के लिए नए तत्व बना रहा है।

मैं इसे और बाद में विश्लेषण करने की कोशिश करूंगा।

+0

आपकी सहायता गर्भ के लिए धन्यवाद। – GONeale

+0

नमस्ते, मैं वहां के अंदर क्या हो रहा है यह देखने के लिए स्रोत कोड के बाद एक ही मार्ग पर चला गया (कभी-कभी मेरी ड्रॉपडाउनलिस्ट के साथ बहुत सी समस्याएं होती हैं, जहां पर चयन सूची आती है ...)। आपने इसे परावर्तक में कैसे किया? एमवीसी ढांचे में कुछ चीजों के लिए कॉल स्टैक प्राप्त करने में सक्षम होने के लिए सहायक होगा। – Jason

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