ModelState.IsValid == false ทำไม?


120

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

คำตอบ:


45

เกี่ยวกับ "เป็นไปได้ไหมว่า 0 ข้อผิดพลาดและ IsValid == false": นี่คือซอร์สโค้ด MVC จากhttps://github.com/Microsoft/referencesource/blob/master/System.Web/ModelBinding/ModelStateDictionary.cs#L37-L41

public bool IsValid {
    get {
        return Values.All(modelState => modelState.Errors.Count == 0);
    }
}

ตอนนี้ดูเหมือนจะไม่ไหวแล้ว นั่นคือสำหรับ ASP.NET MVC v1


สำหรับฉันแล้วดูเหมือนว่าไม่ควรมีสิ่งผิดปกติใน Values ​​All (modelState => modelState.Errors.Count == 0) หรือไม่
Omu

สังเกตว่าข้อผิดพลาดอาจเป็นข้อความหรือข้อยกเว้น ตัวอย่างเช่น Html.ValidationSummary ไม่แสดงข้อยกเว้น (สำหรับเหตุผลด้านความปลอดภัยฉันเดา); นั่นอาจเป็นสาเหตุที่คุณไม่เห็นข้อผิดพลาด คุณจะตรวจสอบอย่างไรเพื่อไม่ให้เกิดข้อผิดพลาด?
queen3

1
ModelState.IsValid ให้เท็จ
Omu

ฮ่าฮ่าที่ชัดเจน ... คุณจะตรวจสอบ "ค่ามี 0 ข้อผิดพลาด" ได้อย่างไร?
queen3

258

ในขณะที่คุณกำลังเขียนโปรแกรมใน Visual Studio คุณควรใช้ประโยชน์จากความเป็นไปได้ในการใช้เบรกพอยต์สำหรับขั้นตอนการดีบักที่ง่ายเช่นนี้ (ทำความเข้าใจว่าปัญหาคืออะไรในกรณีของคุณ) เพียงวางไว้ด้านหน้า / ตรงตำแหน่งที่คุณตรวจสอบ ModelState.isValid และวางเมาส์เหนือ ModelState ตอนนี้คุณสามารถเรียกดูค่าทั้งหมดภายในได้อย่างง่ายดายและดูว่าข้อผิดพลาดใดที่ทำให้เกิด isvalid return false

modelstate


3
เป็นไปได้ไหมที่ค่าทั้งหมดมีข้อผิดพลาด 0 และ modelstate ยังคงไม่ถูกต้อง
Omu

ตามที่กล่าวไว้ข้างต้นไม่เป็นไปไม่ได้ :) ที่ไหนสักแห่งจะต้องนับ Error! = 0
bastijn

2
ในฐานะที่เป็นส่วนเสริมหาก ErrorMessage ไม่ชัดเจนสำหรับคุณคุณสามารถไปที่คีย์และจะแสดงให้คุณเห็นว่าตัวแปรใดที่อ้างอิงถึง
Luminous

1
ในมุมมองของคุณ do: @ Html.HiddenFor (model => model.Username) จะแก้ปัญหาได้!
Umit Kaya

1
var asdf = ModelState.Values.Where(v => v.Errors.Count > 0);สามารถช่วยคุณได้
Cirelli94

37

วางโค้ดด้านล่างใน ActionResult ของคอนโทรลเลอร์ของคุณและวางดีบักเกอร์ที่จุดนี้

var errors = ModelState
    .Where(x => x.Value.Errors.Count > 0)
    .Select(x => new { x.Key, x.Value.Errors })
    .ToArray();

3
คำตอบที่ดีที่สุดที่นี่ควรได้รับการจัดอันดับให้สูงขึ้น ทำไมต้องใช้เวลาของฉันในการขุดดูวัตถุ ModelState 5 ชั้นในดีบักเกอร์ในเมื่อฉันสามารถเอาข้อผิดพลาดออกมาได้ ฉันจะอยู่ที่นั่นทุกเช้าถ้าฉันทำตามคำตอบที่ได้คะแนนสูงสุด
Sean T

2
นี้เป็นดีที่สุดที่เคย
ของเล่นที่

23
bool hasErrors =  ViewData.ModelState.Values.Any(x => x.Errors.Count > 1);

หรือวนซ้ำด้วย

    foreach (ModelState state in ViewData.ModelState.Values.Where(x => x.Errors.Count > 0))
    {

    }

เป็นไปได้ไหมที่ค่าทั้งหมดมีข้อผิดพลาด 0 และ modelstate ยังคงไม่ถูกต้อง
Omu

1
modelstate จะมีคีย์ "คุณสมบัติ" และข้อผิดพลาดที่เกี่ยวข้องในพจนานุกรม ข้อความแสดงข้อผิดพลาดอาจว่างเปล่า แต่จำนวนข้อผิดพลาดจะแสดงจำนวนคุณสมบัติที่ไม่ถูกต้อง เนื่องจากเมธอด ModelStateDictionary.AddModelError ใช้คีย์และข้อยกเว้นหรือสตริงข้อผิดพลาด จำเป็นต้องเพิ่มข้อผิดพลาดของโมเดล
Michael G

13

บางครั้งเครื่องผูกโยนข้อยกเว้นโดยไม่มีข้อความแสดงข้อผิดพลาด คุณสามารถดึงข้อยกเว้นด้วยตัวอย่างต่อไปนี้เพื่อดูว่ามีอะไรผิดปกติ:

(บ่อยครั้งหากเครื่องผูกพยายามแปลงสตริงเป็นประเภทที่ซับซ้อนเป็นต้น)

 if (!ModelState.IsValid)
            {
var errors = ModelState.SelectMany(x => x.Value.Errors.Select(z => z.Exception));

// Breakpoint, Log or examine the list with Exceptions.

  }

1
รหัสนี้มีประโยชน์มากสำหรับฉัน แต่การทำซ้ำข้อผิดพลาด (ข้อยกเว้น) เพื่อรับแต่ละข้อความส่งผลให้ "การอ้างอิงวัตถุไม่ได้ตั้งค่าเป็นตัวอย่างของวัตถุ" เมื่อฉันเปลี่ยน z.Exception เป็น z.ErrorMessage ฉันสามารถแสดงข้อความแสดงข้อผิดพลาด
StackOverflowUser

นี่เป็นทางออกสำหรับฉันโดยเปลี่ยนเป็น z.ErrorMessage แม้ว่าฉันจะไม่ได้รับข้อผิดพลาดกับ z.Exception แต่เป็นเพียงค่า null น่าจะคุ้มค่าที่จะอัปเดตคำตอบเดิม
esp

5

หากคุณลบการตรวจสอบ ModelsState.IsValid และปล่อยให้เกิดข้อผิดพลาดหากคุณคัดลอกบรรทัดนี้((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrorsและวางลงในส่วนนาฬิกาใน Visual Studio จะทำให้คุณทราบว่าข้อผิดพลาดคืออะไร ช่วยประหยัดเวลาในการตรวจสอบข้อผิดพลาดได้มาก


1
เคล็ดลับที่เป็นประโยชน์จริงๆ
เถ้า

นี่คือคำแนะนำที่ดีที่สุดในกระทู้นี้ ปัญหาที่ฉันมีคือโง่ "." (dot) ใน UserName
mangia

3

คุณสมบัติ ModelState บนคอนโทรลเลอร์เป็นวัตถุ ModelStateDictionary คุณสามารถวนซ้ำผ่านคีย์บนพจนานุกรมและใช้เมธอด IsValidField เพื่อตรวจสอบว่าฟิลด์นั้นถูกต้องหรือไม่


3

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


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