NerdDinner में ASP.NET MVC के लिए ModelState.IsValid मान्य है?


148

प्रोफेशनल ASP.NET MVC 1.0 के नर्डडिनर उदाहरण पर कॉपी किए गए बलो के रूप में एक नया डिनर बनाने की विधि है (मुक्त नर्डडिनर संस्करण का पृष्ठ 89)।

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

फॉर्म जमा करते समय, यदि आपको तारीख में कोई त्रुटि है, तो ModelState.IsValid गलत हो जाएगा और आपको एक त्रुटि वापस मिल जाएगी, लेकिन केवल तारीख के लिए क्योंकि AddRuleViolations को कभी भी निष्पादित नहीं किया गया था। यदि आप पूरी तरह से ModelState.IsValid के लिए चेक निकालते हैं, तो आपको अमान्य होने पर तारीख में एक अंकन सहित सभी त्रुटियां (अपवाद के कारण) मिलेंगी। तो फिर, 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); 
} 

जवाबों:


143

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

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

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


ब्रैड यह पता लगाने का कोई तरीका है कि क्या कोई मॉडल जो DataAnnotations "IsValid" से बिना मॉडलस्टेट के सजाया गया है। (उदाहरण के लिए कहें कि ऑब्जेक्ट एक फ़ाइल से लोड किया गया है या कंसोल ऐप आदि में उपयोग किया गया है)
runxc1 ब्रेट फेरीर

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

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

13
उपयोग: var errors = ModelState.Values.SelectMany(v => v.Errors);किसी भी सत्यापन मुद्दों को देखने के लिए एक विराम बिंदु के साथ।
full_prog_full 13

कभी-कभी इसकी संबंधित तालिका में एक त्रुटि यदि संपत्ति के नाम बदल दिए गए हैं, तो माइग्रेशन नहीं किए गए हैं और परिणामस्वरूप SaveChanges (); परिवर्तन के कारण विफल होता है और नहीं हो सकता है।
Oracular Man

25

इरेटा से: 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


5
2015 तक AddModelErrorsविधि मौजूद नहीं है।
फेलिप कोरिआ

6
2016 तक, ModelState.AddModelErrors()विधि मौजूद है
जॉन

7
2017 तक, गैर-बहुवचन ModelState.AddModelErrorपद्धति मौजूद है।
१०:३

0

हां, जेरेड और केली ऑर सही हैं। मैं निम्नलिखित कोड का उपयोग करता हूं जैसे कि संपादन अपवाद।

foreach (var issue in dinner.GetRuleViolations())
{
    ModelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
}

के बजाय

ModelState.AddRuleViolations(dinner.GetRuleViolations());

0

सभी मॉडल फ़ील्ड जिनमें निश्चित प्रकार होते हैं, जिन्हें नियंत्रक के पास लौटते समय मान्य किया जाना चाहिए। यदि मॉडल क्षेत्र में से कोई भी उनके परिभाषित प्रकार के साथ मेल नहीं खा रहा है, तो ModelState.IsValid गलत वापस आ जाएगी। क्योंकि, ये त्रुटियाँ ModelState में जोड़ी जाएंगी।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.