ModelState.IsValid == false, tại sao?


120

Tôi có thể tìm thấy danh sách các lỗi khiến ModelState không hợp lệ ở đâu? Tôi không thấy bất kỳ thuộc tính lỗi nào trên đối tượng ModelState.

Câu trả lời:


45

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.


đối với tôi có vẻ như không nên, có gì sai trong Values.All (modelState => modelState.Errors.Count == 0) không?
Omu

Lưu ý rằng lỗi có thể là Thông báo hoặc Ngoại lệ; ví dụ Html.ValidationSummary không hiển thị ngoại lệ (tôi đoán vì lý do bảo mật); có lẽ đó là lý do tại sao bạn không thấy lỗi? Làm thế nào để bạn kiểm tra không có lỗi?
nữ hoàng 3

1
ModelState.IsValid đưa ra sai
Omu

Ha-ha, điều đó rõ ràng ... làm thế nào để bạn kiểm tra "các giá trị có 0 lỗi"?
queen3

258

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.

mô hình


3
Có thể nào tất cả các giá trị có 0 lỗi và modelstate vẫn không hợp lệ không?
Omu

như đã nói ở trên, không có điều này là không thể :). Ở đâu đó phải là số Lỗi! = 0.
bastijn

2
Như một phần bổ sung, nếu ErrorMessage không rõ ràng đối với bạn, bạn có thể đi tới các phím và nó sẽ hiển thị cho bạn biết nó đang đề cập đến biến nào.
Sáng

1
trong Chế độ xem của bạn, do: @ Html.HiddenFor (model => model.Username) sẽ giải quyết vấn đề!
Umit Kaya

1
var asdf = ModelState.Values.Where(v => v.Errors.Count > 0);có thể giúp bạn
Cirelli94

37

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();

3
Câu trả lời tốt nhất ở đây, nên được đánh giá cao hơn. Tại sao lại dành thời gian đào qua 5 lớp của đối tượng ModelState trong trình gỡ lỗi khi tôi có thể sửa lỗi từ nó. Tôi muốn có mặt ở đó tất cả các buổi sáng nếu tôi đi theo câu trả lời cao nhất đánh giá
Sean T

2
đây là điều tốt nhất từ ​​trước đến nay
đồ chơi

23
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))
    {

    }

Có thể nào tất cả các giá trị có 0 lỗi và modelstate vẫn không hợp lệ không?
Omu

1
Modelstate sẽ có một khóa "Thuộc tính" và một lỗi liên quan trong từ điển. thông báo lỗi có thể để trống, nhưng số lỗi sẽ phản ánh số thuộc tính không hợp lệ. Bởi vì phương thức ModelStateDictionary.AddModelError nhận một khóa và Chuỗi ngoại lệ hoặc lỗi; nó bắt buộc phải thêm một lỗi mô hình.
Michael G

13

Đô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.

  }

1
Mã này rất hữu ích đối với tôi, nhưng việc lặp lại các lỗi (Ngoại lệ) để lấy từng .Message dẫn đến "tham chiếu đối tượng không được đặt thành phiên bản của đối tượng". Khi tôi thay đổi z.Exception thành z.ErrorMessage, tôi có thể hiển thị thông báo lỗi.
StackOverflowUser

Đây là giải pháp cho tôi, thay đổi thành z.ErrorMessage, mặc dù tôi không gặp lỗi với z.Exception, chỉ là giá trị null. Có lẽ giá trị cập nhật câu trả lời ban đầu.
đặc biệt là

5

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).EntityValidationErrorsvà 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.


1
Mẹo thực sự hữu ích.
Ash

Đây là lời khuyên tốt nhất trong chủ đề này. Vấn đề tôi gặp phải là một "." (dấu chấm) trong UserName
Mangia

3

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.


3

Như vừa xảy ra với tôi - điều này cũng có thể xảy ra khi bạn thêm thuộc tính bắt buộc vào mô hình của mình mà không cập nhật biểu mẫu của bạn. Trong trường hợp này, ValidationSummary sẽ không liệt kê thông báo lỗi.


1
Điều này đã xảy ra với tôi. Thx cho tiền boa!
Lewis86
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.