ModelState.IsValid ใช้ได้ใน ASP.NET MVC ใน NerdDinner อย่างไร


148

ในตัวอย่างNerdDinnerของProfessional ASP.NET MVC 1.0มีวิธีการสร้างอาหารเย็นใหม่ตามที่คัดลอกต่อไป (หน้า 89 ของรุ่น NerdDinner ฟรี)

มีการตรวจสอบ 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หรือไม่

เครื่องผูกรุ่นเริ่มต้นจะเพิ่มข้อผิดพลาดบางอย่างสำหรับปัญหาการแปลงประเภทพื้นฐาน (ตัวอย่างเช่นการส่งตัวเลขที่ไม่ใช่ตัวเลขสำหรับสิ่งที่เป็น "int") คุณสามารถเติม ModelState ให้สมบูรณ์ยิ่งขึ้นโดยใช้ระบบการตรวจสอบความถูกต้องที่คุณใช้

ตัวDataAnnotationsยึดโมเดลตัวอย่างจะเติมสถานะของโมเดลด้วยข้อผิดพลาดในการตรวจสอบความถูกต้องที่นำมาจากDataAnnotationsแอตทริบิวต์ในโมเดลของคุณ


แบรดมีวิธีการตรวจสอบว่าเป็นรุ่นที่ตกแต่งด้วย DataAnnotations "IsValid" โดยไม่มี ModelState หรือไม่ (ตัวอย่างเช่นโหลดวัตถุจากไฟล์หรือใช้ในแอพ Console ฯลฯ )
runxc1 Bret Ferrier

1
ไม่ ModelState.IsValid เป็นวิธีเดียวที่จะทราบว่ามีข้อผิดพลาดในการตรวจสอบความถูกต้อง (หรือการแปลงข้อมูล) ในระหว่างการรวมโมเดลหรือไม่
แบรดวิลสัน

@Brad เมื่อคุณพูดว่า "คุณสามารถเติม ModelState ให้สมบูรณ์ยิ่งขึ้นโดยใช้ระบบการตรวจสอบความถูกต้องที่คุณใช้" นั่นเป็นวิธีการที่ประสบความสำเร็จหรือไม่ มีวิธีถอดรหัสรหัสตรวจสอบ ModelState ของฉันสำหรับ ViewModel ของฉันหรือไม่ ฉันใช้ EF4 ดังนั้นการตรวจสอบส่วนใหญ่ของฉันจึงเป็นแบบอัตโนมัติทันที
WEFX

13
ใช้: var errors = ModelState.Values.SelectMany(v => v.Errors);มีจุดพักเพื่อดูปัญหาการตรวจสอบใด ๆ
full_prog_full

บางครั้งข้อผิดพลาดในตารางที่เกี่ยวข้องหากมีการเปลี่ยนแปลงชื่อคุณสมบัติการย้ายข้อมูลไม่ได้ถูกดำเนินการและส่งผลให้ SaveChanges (); ล้มเหลวและไม่สามารถเกิดขึ้นได้เนื่องจากการเปลี่ยนแปลง
Oracular Man

25

จาก 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


5
ในปี 2015 AddModelErrorsไม่มีวิธีการนี้
Felipe Correa

6
นับตั้งแต่ปี 2559 เป็นต้นไปModelState.AddModelErrors()วิธีการนี้มีอยู่
จอห์น

7
ณ ปีพ. ศ. 2560 ModelState.AddModelErrorมีวิธีการที่ไม่เป็นพหูพจน์
Zachafer

0

ใช่ Jared และ Kelly Orr พูดถูก ฉันใช้รหัสต่อไปนี้เหมือนในการแก้ไขข้อยกเว้น

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

แทน

ModelState.AddRuleViolations(dinner.GetRuleViolations());

0

ฟิลด์โมเดลทั้งหมดที่มีประเภทที่แน่นอนควรจะตรวจสอบความถูกต้องเมื่อส่งคืนไปยังตัวควบคุม หากฟิลด์โมเดลใด ๆ ไม่ตรงกับประเภทที่กำหนดไว้ ModelState.IsValid จะส่งคืนค่าเท็จ เนื่องจากข้อผิดพลาดเหล่านี้จะถูกเพิ่มใน ModelState

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.