ฉันจะค้นหารายการข้อผิดพลาดที่ทำให้ ModelState ไม่ถูกต้องได้ที่ไหน ฉันไม่เห็นคุณสมบัติข้อผิดพลาดใด ๆ บนวัตถุ ModelState
ฉันจะค้นหารายการข้อผิดพลาดที่ทำให้ ModelState ไม่ถูกต้องได้ที่ไหน ฉันไม่เห็นคุณสมบัติข้อผิดพลาดใด ๆ บนวัตถุ ModelState
คำตอบ:
เกี่ยวกับ "เป็นไปได้ไหมว่า 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
ในขณะที่คุณกำลังเขียนโปรแกรมใน Visual Studio คุณควรใช้ประโยชน์จากความเป็นไปได้ในการใช้เบรกพอยต์สำหรับขั้นตอนการดีบักที่ง่ายเช่นนี้ (ทำความเข้าใจว่าปัญหาคืออะไรในกรณีของคุณ) เพียงวางไว้ด้านหน้า / ตรงตำแหน่งที่คุณตรวจสอบ ModelState.isValid และวางเมาส์เหนือ ModelState ตอนนี้คุณสามารถเรียกดูค่าทั้งหมดภายในได้อย่างง่ายดายและดูว่าข้อผิดพลาดใดที่ทำให้เกิด isvalid return false
var asdf = ModelState.Values.Where(v => v.Errors.Count > 0);
สามารถช่วยคุณได้
วางโค้ดด้านล่างใน ActionResult ของคอนโทรลเลอร์ของคุณและวางดีบักเกอร์ที่จุดนี้
var errors = ModelState
.Where(x => x.Value.Errors.Count > 0)
.Select(x => new { x.Key, x.Value.Errors })
.ToArray();
bool hasErrors = ViewData.ModelState.Values.Any(x => x.Errors.Count > 1);
หรือวนซ้ำด้วย
foreach (ModelState state in ViewData.ModelState.Values.Where(x => x.Errors.Count > 0))
{
}
บางครั้งเครื่องผูกโยนข้อยกเว้นโดยไม่มีข้อความแสดงข้อผิดพลาด คุณสามารถดึงข้อยกเว้นด้วยตัวอย่างต่อไปนี้เพื่อดูว่ามีอะไรผิดปกติ:
(บ่อยครั้งหากเครื่องผูกพยายามแปลงสตริงเป็นประเภทที่ซับซ้อนเป็นต้น)
if (!ModelState.IsValid)
{
var errors = ModelState.SelectMany(x => x.Value.Errors.Select(z => z.Exception));
// Breakpoint, Log or examine the list with Exceptions.
}
หากคุณลบการตรวจสอบ ModelsState.IsValid และปล่อยให้เกิดข้อผิดพลาดหากคุณคัดลอกบรรทัดนี้((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors
และวางลงในส่วนนาฬิกาใน Visual Studio จะทำให้คุณทราบว่าข้อผิดพลาดคืออะไร ช่วยประหยัดเวลาในการตรวจสอบข้อผิดพลาดได้มาก
คุณสมบัติ ModelState บนคอนโทรลเลอร์เป็นวัตถุ ModelStateDictionary คุณสามารถวนซ้ำผ่านคีย์บนพจนานุกรมและใช้เมธอด IsValidField เพื่อตรวจสอบว่าฟิลด์นั้นถูกต้องหรือไม่
อย่างที่เพิ่งเกิดขึ้นกับฉันสิ่งนี้สามารถเกิดขึ้นได้เช่นกันเมื่อคุณเพิ่มคุณสมบัติที่จำเป็นในโมเดลของคุณโดยไม่ต้องอัปเดตแบบฟอร์มของคุณ ในกรณีนี้ ValidationSummary จะไม่แสดงข้อความแสดงข้อผิดพลาด