2010-04-06 8 views
14

मैं कस्टम मॉडल बांधने की मशीन का उपयोग कर रहा है कि इस तरह दिखता है:स्थापना ModelState मूल्यों

public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     if (controllerContext == null) 
     { 
      throw new ArgumentNullException("controllerContext"); 
     } 
     if (bindingContext == null) 
     { 
      throw new ArgumentNullException("bindingContext"); 
     } 

     BaseContentObject obj = (BaseContentObject)base.BindModel(controllerContext, bindingContext); 
     if(string.IsNullOrWhiteSpace(obj.Slug)) 
     { 
      // creating new object 
      obj.Created = obj.Modified = DateTime.Now; 
      obj.ModifiedBy = obj.CreatedBy = controllerContext.HttpContext.User.Identity.Name; 
      // slug is not provided thru UI, derivate it from Title; property setter removes chars that are not allowed 
      obj.Slug = obj.Title; 
      ModelStateDictionary modelStateDictionary = bindingContext.ModelState; 
      modelStateDictionary.SetModelValue("Slug", new ValueProviderResult(obj.Slug, obj.Slug, null)); 
... 

जब मैं इस बांधने की मशीन से वापस नियंत्रक कार्रवाई में मिलता है, अपने व्यवसाय वस्तु है कि क्रिया के पैरामीटर के रूप में प्रदान किया गया है सही ढंग से बदला गया है (लाइन obj.Created = .... काम)।

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

यदि मैंने डीबग सत्र में अपनी वॉच विंडो में मॉडलस्टेट ["स्लग"] रखा है, तो यह कहता है कि इसमें त्रुटियां हैं (1), तो जाहिर है कि यह खाली है और इस तरह विफल रहता है।

मैं कस्टम मॉडल बाइंडर कोड के अंदर मॉडलस्टेट को सही ढंग से कैसे बदल सकता हूं?

उत्तर

19

स्पष्ट रूप से कुछ कुंजी के मूल्य को बदलने के बाद मॉडलस्टेट को पुन: सत्यापित करने का कोई तरीका नहीं है। IsValid झूठ बनी हुई है क्योंकि कुछ कुंजी के लिए एक नया मान निर्धारित करने से पुनर्मूल्यांकन नहीं होता है।

समाधान सबसे पहले कुंजी को हटाने के लिए है जो IsValid को गलत होने के लिए प्रेरित करता है और इसे फिर से बना देता है और इसे मान निर्दिष्ट करता है। जब आप ऐसा करते हैं तो मॉडलस्टेट स्वचालित रूप से पुन: वैध होता है और यदि सबकुछ ठीक है, तो IsValid सच हो जाता है।

इस तरह:

bindingContext.ModelState.Remove("Slug"); 
bindingContext.ModelState.Add("Slug", new ModelState()); 
bindingContext.ModelState.SetModelValue("Slug", new ValueProviderResult(obj.Slug, obj.Slug, null)); 
+1

आपका समाधान stackoverflow पर चिपचिपा होने की जरूरत है। मैं खोज और प्रयोग कर रहा हूं जब तक कि मुझे यह तुम्हारा नहीं मिला। मैं आपको गारंटी देता हूं, इस चाल के बारे में बहुत से लोग नहीं जानते हैं। आपने मेरे दिन बचाए! धन्यवाद! – Stack0verflow

+0

मैंने आपके समाधान की कोशिश की, और यह मेरी स्थिति के लिए काम किया। क्या आप http://stackoverflow.com/questions/23145780/asp-net-mvc-4-how-to-validate-my-model-in-a-custom-model-binder पर मेरे प्रश्न पर एक नज़र डाल सकते हैं? धन्यवाद! – Stack0verflow

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