ModelState.AddModelError - ฉันจะเพิ่มข้อผิดพลาดที่ไม่ได้มีไว้สำหรับทรัพย์สินได้อย่างไร


190

ฉันกำลังตรวจสอบฐานข้อมูลของฉันในCreate(FooViewModel fvm){...}เพื่อดูว่าfvm.prop1และfvm.prop2มีอยู่แล้วในการรวมกันที่มิ ถ้าเป็นเช่นนั้นฉันต้องการเพิ่มข้อผิดพลาดใน modelstate จากนั้นส่งคืนมุมมองทั้งหมด ฉันเหนื่อย:

public ActionResult Create(FooViewModel fvm){
    if (ThatComboAlreadyExists(fvm)) {
      ModelState.AddModelError("Model", "There is already one like that");
      return View(fvm);
    }
}

... แต่ฉันไม่พบข้อผิดพลาดในHtml.ValidationSummaryซึ่งฉันคิดว่ามันจะปรากฏขึ้น ฉันสงสัยว่า "Model" ไม่ใช่คีย์ที่ถูกต้อง แต่ฉันไม่สามารถหาอะไรได้ใน Google


คำตอบ:


330

ในที่สุดฉันก็สะดุดกับตัวอย่างของการใช้งานที่ฉันกำลังมองหา - เพื่อกำหนดข้อผิดพลาดให้กับ Model โดยทั่วไปแทนที่จะเป็นหนึ่งในคุณสมบัติของมันตามปกติคุณเรียกว่า:

ModelState.AddModelError(string key, string errorMessage);

แต่ใช้สตริงว่างสำหรับคีย์:

ModelState.AddModelError(string.Empty, "There is something wrong with Foo.");

ข้อความแสดงข้อผิดพลาดจะปรากฏขึ้น<%: Html.ValidationSummary() %>ตามที่คุณคาดหวัง


22
กรณีนี้ทำให้ฉันคิดว่า: ทำไมไม่มีวิธีเช่นModelState.AddError(errorMessage)หรือModelState.AddGlobalError(errorMessage)... มันจะง่ายและง่ายต่อการค้นหาวิธีเพิ่มข้อความแสดงข้อผิดพลาดที่ไม่เกี่ยวข้องกับคุณสมบัติของรุ่นใด ๆ
รูเบนส์ Mariuzzo

@Rubens: จริง แต่คุณสามารถเพิ่มวิธีการดังกล่าวได้อย่างง่ายดายด้วยวิธีการขยาย
จอห์นนี่ 5

2
นอกจากนี้คุณยังสามารถแสดงข้อผิดพลาดโดยใช้@Html.ValidationMessage(string.Empty)
Ben Foster

คีย์เป็นคุณสมบัติของโมเดลของคุณที่เชื่อมโยงกับมุมมอง - ซึ่งมีข้อผิดพลาด - เพื่อให้ชัดเจน
niico

1
ValidationSummaryErrors(bool excludePropertyErrors)เกินจะแสดงความผิดพลาดในการตรวจสอบถ้าอาร์กิวเมนต์เป็นเท็จหรือเพียงคนเดียวไม่ใช่คุณสมบัติเฉพาะ (คีย์ = "") ข้อผิดพลาดถ้าอาร์กิวเมนต์เป็นความจริง
Suncat2000

26

คุณสามารถเพิ่มข้อผิดพลาดของแบบจำลองบนคุณสมบัติใด ๆ ของแบบจำลองของคุณได้ฉันขอแนะนำว่าไม่มีอะไรเกี่ยวข้องกับการสร้างคุณสมบัติใหม่

เป็นตัวอย่างเราตรวจสอบว่ามีการใช้อีเมลในฐานข้อมูลอยู่แล้วและเพิ่มข้อผิดพลาดไปยังคุณสมบัติอีเมลในการดำเนินการดังนั้นเมื่อฉันกลับมาดูพวกเขารู้ว่ามีข้อผิดพลาดและวิธีแสดงโดยใช้

<%: Html.ValidationSummary(true)%>
<%: Html.ValidationMessageFor(model => model.Email) %>

และ

ModelState.AddModelError("Email", Resources.EmailInUse);

1
สิ่งนี้ดูเหมือนจะง่ายในกรณีของฉัน - ฉันกำลังตรวจสอบเพื่อดูว่ามีชุดค่าผสม col1 & col2 อยู่ในฐานข้อมูลอยู่แล้วหรือไม่ดังนั้นจึงดูเหมือนจะไม่ถูกต้องที่จะมีคุณสมบัติ ปรากฎว่าคุณสามารถเพิ่มข้อผิดพลาดในแบบจำลองของคุณ - ดูคำตอบของฉัน
Scott Baker

1
มีวิธีรับสตริง "อีเมล" สำหรับ AddModelError โดยไม่ใช้สตริงตัวอักษรที่เปราะบางหรือไม่? ชอบ(m=>m.email).SomeMagicToString()ไหม
Snekse

ฉันไม่คิดว่าเป็นเช่นนั้นคุณต้องไปกับสตริงมายากล ... ไม่ดีที่สุด แต่ยังคงเป็นทางออกที่ดี
VinnyG

4
nameofผู้ประกอบการมาใน C # 6.0 แก้ปัญหาสตริงมหัศจรรย์นี้ msdn.microsoft.com/en-us/magazine/dn802602.aspx
RJ Cuthbertson

3

การวางโมเดลคุณสมบัติ dot ในสตริงทำงานได้สำหรับฉัน: ModelState.AddModelError("Item1.Month", "This is not a valid date");


2
นั่นจะแสดงเดือนที่ไม่ถูกต้องใน UI ของคุณ แต่ก็ไม่ได้แก้ปัญหาเดิม
Scott Baker

2
ปัญหาดั้งเดิมเกิดจากการไม่เข้าใจว่า "คีย์" หมายถึงอะไรในวิธีการ สิ่งนี้ให้ความกระจ่างเกี่ยวกับฟังก์ชั่น "คีย์" ดังนั้นจึงเป็นการดีที่จะรู้ว่าคีย์ไม่จำเป็นต้องเป็นเพียงชื่อคุณสมบัติ แต่ยังสามารถอ้างถึงคุณสมบัติที่ซ้อนกันหรือค่าพิเศษ String.Empty
Triynko
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.