2011-01-31 39 views
8

यह एक नियंत्रक कार्रवाई है कि मैं ajax पोस्ट विधि के साथ कहते हैं:मॉडलस्टेट को कैसे अपडेट करें?

[HttpPost] 
    public ActionResult Add(Comment comment) 
    { 
     if (User.Identity.IsAuthenticated) 
     { 
      comment.Username = User.Identity.Name; 
      comment.Email = Membership.GetUser().Email; 
     } 

     if (ModelState.IsValid) 
     { 
      this.db.Add(comment); 
      return PartialView("Comment", comment); 
     } 
     else 
     { 
      //... 
     } 
    } 

तो उपयोगकर्ता के प्रवेश, प्रपत्र सबमिट उपयोगकर्ता नाम और ईमेल क्षेत्रों नहीं है है, तो वे ajax कॉल द्वारा पारित नहीं मिलता । जब कार्रवाई को ModelStat.IsValid को झूठा रिटर्न कहा जाता है, क्योंकि इन दो गुणों की आवश्यकता होती है। गुणों के वैध मान सेट करने के बाद, मैं मॉडलस्टेट को अपडेट करने के लिए मॉडल सत्यापन कैसे ट्रिगर करूं?

उत्तर

4

आप User.Identity से टिप्पणी के उपयोगकर्ता नाम और ईमेल गुण बाध्य करने के लिए एक कस्टम model binder उपयोग कर सकते हैं। चूंकि बाध्यकारी सत्यापन से पहले होती है क्योंकि मॉडलस्टेट तब मान्य होगा।

एक और विकल्प टिप्पणी वर्ग के लिए कस्टम model validator लागू करना है, जो सत्यापित उपयोगकर्ता के लिए ControllerContext.Controller जांचता है।

इनमें से किसी भी विकल्प को लागू करके आप चेक को पहले हटा सकते हैं।

+0

से उपयोगकर्ता की तरह जोड़ा जाएगा। मुझे डर था कि यह उस पर आएगा। कोई अन्य समाधान? – frennky

+1

डरो मत, वे सबसे स्वच्छ, "सबसे अधिक एमवीसी" समाधान हैं। उन्हें लागू करके आप उस ढांचे के बारे में कुछ और सीखेंगे जो आप काम कर रहे हैं। – m0sa

+0

हाँ, मुझे पता है। मैं इसे सरल रखने के लिए बस रोक रहा था। मैंने कस्टम मॉडल बाइंडर लागू किया है, इस तरह मैंने सत्यापन रखा है। मुझे सही दिशा में इंगित करने के लिए धन्यवाद। – frennky

3

आप TryUpdateModel विधि में निर्मित कॉल करने का प्रयास कर सकते हैं जो एक बूलियन लौटाता है ताकि आप उस मान को देख सकें।

अद्यतन: अपवादों के साथ TryUpdateModel का उपयोग करने का प्रयास करें। कार्रवाई में टिप्पणी के बजाय एक formcollection का प्रयोग करें।

[HttpPost] 
    public ActionResult Add(FormCollection collection) 
    { 

     string[] excludedProperties = new string[] { "Username". "Email" }; 
     var comment = new Comment(); 
     if (User.Identity.IsAuthenticated) 
     { 
      comment.Username = User.Identity.Name; 
      comment.Email = Membership.GetUser().Email; 
     } 

     TryUpdateModel<Comment>(comment, "", null, excludedProperties, collection.ToValueProvider()); 

     if (ModelState.IsValid) 
     { 
      this.db.Add(comment); 
      return PartialView("Comment", comment); 
     } 
     else 
     { 
      //... 
     } 
    } 
+0

नहीं, यह पहली बात है कि मैंने कोशिश की और नियंत्रक में अन्य सभी विधि: UpdateModel, ValidateModel, TryValidate। इनमें से कोई भी काम नहीं करता है, मुझे अपवाद मिलता है: मॉडल को अद्यतन/मान्य या कुछ समान नहीं किया जा सकता है। – frennky

+0

उस मामले में ViewModel का उपयोग क्यों नहीं करें? इसमें आपके द्वारा किए गए सभी गुणों को शामिल किया जाएगा और लापता लोगों के बारे में चिंता करने की आवश्यकता नहीं है। – Jon

+0

एक व्यूमोडेल आज़माएं या मेरे उत्तर – Jon

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