2009-05-19 11 views
126

NerdDinnerProfessional ASP.NET MVC 1.0 के उदाहरण पर कॉपी किए गए बेलो के रूप में एक नया रात्रिभोज बनाने के लिए एक तरीका है (नि: शुल्क NerdDinner संस्करण का पृष्ठ 89)।ModelState.IsValid क्या है NerdDinner में एएसपी.नेट एमवीसी में मान्य है?

वहां यह आदर्श के लिए ModelState.IsValid की जांच करता है। ऐसा लगता है कि मॉडल डेटाबेस के लिए मान्य है या नहीं, यानी, यह डेटा प्रकार रूपांतरणों को कैच करता है, जैसे अवैध प्रारूप वाले तिथियां, लेकिन व्यवसाय नियम नहीं)। क्या यह सच है?

फॉर्म सबमिट करते समय, यदि आपको तिथि में कोई त्रुटि है, तो ModelState.IsValid गलत होगा और आपको एक त्रुटि वापस मिल जाएगी, लेकिन केवल तारीख के लिए क्योंकि AddRuleViolations कभी निष्पादित नहीं किया गया था। यदि आप ModelState.IsValid के लिए पूरी तरह से चेक हटाते हैं, तो आपको अमान्य होने की तारीख में अंकन सहित सभी त्रुटियां (अपवाद के कारण) मिल जाएगी। फिर, मॉडलस्टेट के लिए जांच क्यों है। यह सब वहाँ है? क्या मैं कुछ भूल रहा हूँ?

// 
// POST: /Dinners/Create 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create(Dinner dinner) { 
    if (ModelState.IsValid) { 
     try { 
      dinner.HostedBy = "SomeUser"; 

      dinnerRepository.Add(dinner); 
      dinnerRepository.Save(); 

      return RedirectToAction("Details", new {id = dinner.DinnerID }); 
     } catch { 
      ModelState.AddRuleViolations(dinner.GetRuleViolations()); 
     } 
    } 
    return View(dinner); 
} 

उत्तर

124

ModelState.IsValid आपको बताता है कि किसी भी मॉडल त्रुटियों ModelState में जोड़ा गया है।

डिफ़ॉल्ट मॉडल बाइंडर मूल प्रकार के रूपांतरण समस्याओं के लिए कुछ त्रुटियों को जोड़ देगा (उदाहरण के लिए, किसी चीज़ के लिए गैर-संख्या उत्तीर्ण करना जो "int" है)। आप जो भी सत्यापन प्रणाली का उपयोग कर रहे हैं उसके आधार पर आप मॉडलस्टेट को पूरी तरह से पॉप्युलेट कर सकते हैं।

नमूना DataAnnotations मॉडल बाइंडर आपके मॉडल पर DataAnnotations विशेषताओं से ली गई सत्यापन त्रुटियों के साथ मॉडल स्थिति भर देगा।

+0

ब्रैड वहाँ किसी भी तरह से पता लगाने के लिए है अगर एक मॉडल है कि DataAnnotations साथ सजाया गया है "अगर है "मॉडलस्टेट के बिना। (उदाहरण के लिए कहें ऑब्जेक्ट को फ़ाइल से लोड किया गया है या कंसोल ऐप इत्यादि में उपयोग किया जाता है) –

+1

नहीं, मॉडलस्टेट.इस्वालिड यह जानने का एकमात्र तरीका है कि मॉडल बाध्यकारी के दौरान कोई सत्यापन (या डेटा रूपांतरण) त्रुटियां थीं। –

+0

@ ब्रैड, जब आप कहते हैं, "आप जो भी सत्यापन प्रणाली का उपयोग कर रहे हैं उसके आधार पर आप मॉडलस्टेट को पूरी तरह से पॉप्युलेट कर सकते हैं", यह कैसे पूरा किया जाता है? क्या मेरे ViewModel के लिए मेरे मॉडलस्टेट सत्यापन कोड को क्रैक-ओपन करने का कोई तरीका है? मैं ईएफ 4 का उपयोग कर रहा हूं, इसलिए मेरी अधिकांश मान्यता स्वचालित रूप से आउट-ऑफ-द-बॉक्स है। – WEFX

24

Errata से: ModelState.AddRuleViolations(dinner.GetRuleViolations());

होना चाहिए:

ModelState.AddModelErrors(dinner.GetRuleViolations());

संदर्भ: http://www.wrox.com/WileyCDA/WroxTitle/Professional-ASP-NET-MVC-1-0.productCd-0470384611,descCd-ERRATA.html

+4

2015 तक 'AddModelErrors' विधि मौजूद नहीं है। –

+4

2016 तक, 'ModelState.AddModelErrors() 'विधि मौजूद है – John

+4

2017 तक, गैर-बहुवचन' ModelState.AddModelError' विधि मौजूद है। – Zachafer

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