Câu trả lời:
Về "có thể là 0 lỗi và IsValid == false": đây là mã nguồn MVC từ 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);
}
}
Bây giờ, có vẻ như nó không thể được. Đó là dành cho ASP.NET MVC v1.
Vì bạn có thể đang lập trình trong Visual studio, bạn nên tận dụng khả năng sử dụng các điểm ngắt cho các bước gỡ lỗi dễ dàng như vậy (hiểu vấn đề như trong trường hợp của bạn). Chỉ cần đặt chúng ngay phía trước / tại nơi bạn kiểm tra ModelState.isValid và di chuột qua ModelState. Bây giờ bạn có thể dễ dàng duyệt qua tất cả các giá trị bên trong và xem lỗi nào gây ra lỗi không hợp lệ trả về sai.
var asdf = ModelState.Values.Where(v => v.Errors.Count > 0);
có thể giúp bạn
Dán đoạn mã dưới đây vào ActionResult của bộ điều khiển của bạn và đặt trình gỡ lỗi vào thời điểm này.
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);
hoặc lặp lại với
foreach (ModelState state in ViewData.ModelState.Values.Where(x => x.Errors.Count > 0))
{
}
Đôi khi một chất kết dính ném ra một ngoại lệ mà không có thông báo lỗi. Bạn có thể truy xuất ngoại lệ bằng đoạn mã sau để tìm hiểu điều gì sai:
(Thường nếu chất kết dính đang cố gắng chuyển đổi các chuỗi thành các kiểu phức tạp, v.v.)
if (!ModelState.IsValid)
{
var errors = ModelState.SelectMany(x => x.Value.Errors.Select(z => z.Exception));
// Breakpoint, Log or examine the list with Exceptions.
}
Nếu bạn bỏ kiểm tra ModelsState.IsValid và để lỗi, nếu bạn sao chép dòng này ((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors
và dán vào phần đồng hồ trong Visual Studio, nó sẽ cho bạn biết chính xác lỗi là gì. Tiết kiệm nhiều thời gian kiểm tra lỗi ở đâu.
Thuộc tính ModelState trên bộ điều khiển thực sự là một đối tượng ModelStateDictionary. Bạn có thể lặp lại các khóa trên từ điển và sử dụng phương thức IsValidField để kiểm tra xem trường cụ thể đó có hợp lệ hay không.