ModelState.IsValid hợp lệ trong ASP.NET MVC trong NerdDinner là gì?


148

Trên ví dụ NerdDinner của Professional ASP.NET MVC 1.0, có một phương pháp để tạo ra một bữa tối mới dưới dạng sao chép dưới đây (trang 89 của phiên bản NerdDinner miễn phí).

Ở đó, nó kiểm tra ModelState.IsValid cho đúng. Nó dường như kiểm tra xem mô hình có hợp lệ cho cơ sở dữ liệu hay không (nghĩa là nó bắt các chuyển đổi loại dữ liệu, như ngày có định dạng không hợp lệ, nhưng không phải là quy tắc kinh doanh). Điều đó có đúng không?

Khi gửi biểu mẫu, nếu bạn gặp lỗi trong ngày, ModelState.IsValid sẽ sai và bạn sẽ nhận lại lỗi, nhưng chỉ cho ngày vì AddRuleViolations chưa bao giờ được thực thi. Nếu bạn xóa hoàn toàn kiểm tra ModelState.IsValid, thì bạn sẽ nhận được tất cả các lỗi (do ngoại lệ), bao gồm cả việc đánh dấu vào ngày khi nó không hợp lệ. Vậy thì, tại sao lại kiểm tra ModelState.IsValid ở đó? Tui bỏ lỡ điều gì vậy?

// 
// POST: /Dinners/Create 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create(Dinner dinner) {
    if (ModelState.IsValid) {
        try {
            dinner.HostedBy = "SomeUser"; 

            dinnerRepository.Add(dinner);
            dinnerRepository.Save();

            return RedirectToAction("Details", new {id = dinner.DinnerID }); 
        } catch {
            ModelState.AddRuleViolations(dinner.GetRuleViolations());
        } 
    } 
    return View(dinner); 
} 

Câu trả lời:


143

ModelState.IsValidcho bạn biết nếu bất kỳ lỗi mô hình đã được thêm vào ModelState.

Trình kết dính mô hình mặc định sẽ thêm một số lỗi cho các vấn đề chuyển đổi loại cơ bản (ví dụ: chuyển một số không cho một số là "int"). Bạn có thể điền ModelState đầy đủ hơn dựa trên bất kỳ hệ thống xác nhận nào bạn đang sử dụng.

Chất DataAnnotationskết dính mô hình mẫu sẽ điền vào trạng thái mô hình với các lỗi xác thực được lấy từ các DataAnnotationsthuộc tính trên mô hình của bạn.


Brad có cách nào để tìm hiểu xem một Mô hình được trang trí với DataAnnotations "IsValid" không có ModelState. (Ví dụ: Đối tượng được tải từ tệp hoặc được sử dụng trong Ứng dụng Bảng điều khiển, v.v.)
runxc1 Bret Ferrier

1
Không, ModelState.IsValid là cách duy nhất để biết liệu có bất kỳ lỗi xác thực (hoặc chuyển đổi dữ liệu) nào trong quá trình ràng buộc mô hình hay không.
Brad Wilson

@Brad, khi bạn nói "Bạn có thể điền ModelState đầy đủ hơn dựa trên bất kỳ hệ thống xác thực nào bạn đang sử dụng", điều đó được thực hiện như thế nào? Có cách nào để mở mã xác thực ModelState cho ViewModel của tôi không? Tôi đang sử dụng EF4, vì vậy hầu hết các xác nhận của tôi là tự động vượt trội.
WEFX

13
Sử dụng: var errors = ModelState.Values.SelectMany(v => v.Errors);với một điểm dừng để xem bất kỳ vấn đề xác nhận.
full_prog_full

Đôi khi, đó là lỗi trong bảng liên quan nếu tên thuộc tính đã bị thay đổi, việc di chuyển không được thực hiện và kết quả là SaveChanges (); thất bại và không thể xảy ra do sự thay đổi.
Người đàn ông ngoạn mục

25

Từ Errata: ModelState.AddRuleViolations(dinner.GetRuleViolations());

Nên là:

ModelState.AddModelErrors(dinner.GetRuleViolations());

Tham khảo: http://www.wrox.com


5
Kể từ năm 2015, AddModelErrorsphương pháp này không tồn tại.
Felipe Correa

6
Kể từ năm 2016, ModelState.AddModelErrors()phương thức này tồn tại
John

7
Kể từ năm 2017, ModelState.AddModelErrorphương pháp không số nhiều tồn tại.
Zachafer

0

Phải, Jared và Kelly Orr đã đúng. Tôi sử dụng mã sau đây như trong ngoại lệ chỉnh sửa.

foreach (var issue in dinner.GetRuleViolations())
{
    ModelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
}

thay vì

ModelState.AddRuleViolations(dinner.GetRuleViolations());

0

Tất cả các trường mô hình có các loại xác định, các trường nên được xác nhận khi trả về Bộ điều khiển. Nếu bất kỳ trường mô hình nào không khớp với loại được xác định, thì ModelState.IsValid sẽ trả về false. Bởi vì, những lỗi này sẽ được thêm vào ModelState.

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.