ModelState.AddModelError - Làm cách nào tôi có thể thêm một lỗi không phải cho một thuộc tính?


188

Tôi đang kiểm tra cơ sở dữ liệu của mình Create(FooViewModel fvm){...}để xem nếu fvm.prop1fvm.prop2đã tồn tại trong sự kết hợp đó; nếu vậy, tôi muốn thêm một lỗi vào modelstate, sau đó trả về toàn bộ khung nhìn. Tôi đã thử:

public ActionResult Create(FooViewModel fvm){
    if (ThatComboAlreadyExists(fvm)) {
      ModelState.AddModelError("Model", "There is already one like that");
      return View(fvm);
    }
}

... nhưng tôi không nhận được lỗi nào trong Html.ValidationSummaryđó, đó là nơi tôi cho rằng chúng sẽ xuất hiện. Tôi có nghi ngờ rằng "Model" không phải là chìa khóa phù hợp, nhưng tôi chưa thể tìm thấy bất cứ thứ gì như Google.


Câu trả lời:


328

Cuối cùng tôi đã vấp phải một ví dụ về cách sử dụng mà tôi đang tìm kiếm - để gán lỗi cho Model nói chung, thay vì một trong các thuộc tính của nó, như thường lệ bạn gọi:

ModelState.AddModelError(string key, string errorMessage);

nhưng sử dụng một chuỗi rỗng cho khóa:

ModelState.AddModelError(string.Empty, "There is something wrong with Foo.");

Thông báo lỗi sẽ tự hiển thị <%: Html.ValidationSummary() %>theo như bạn mong đợi.


21
Trường hợp này khiến tôi suy nghĩ: Tại sao không có một phương thức như ModelState.AddError(errorMessage)hoặc ModelState.AddGlobalError(errorMessage)... nó sẽ trực quan và dễ dàng hơn để tìm ra cách thêm một thông báo lỗi không liên quan đến bất kỳ thuộc tính nào của mô hình.
Rubens Mariuzzo

@Rubens: Đúng, nhưng bạn có thể dễ dàng thêm một phương thức như vậy bằng các phương thức mở rộng.
Johnny5

2
Bạn cũng có thể hiển thị lỗi bằng cách sử dụng@Html.ValidationMessage(string.Empty)
Ben Foster

khóa là thuộc tính của mô hình của bạn bị ràng buộc với chế độ xem - có lỗi - chỉ cần rõ ràng.
niico

1
Quá ValidationSummaryErrors(bool excludePropertyErrors)tải sẽ hiển thị tất cả các lỗi xác thực nếu đối số của nó là sai hoặc chỉ các lỗi không thuộc tính cụ thể (key = "") nếu đối số của nó là đúng.
Suncat2000

26

Bạn có thể thêm lỗi mô hình vào bất kỳ thuộc tính nào trong mô hình của bạn, tôi đề nghị nếu không có gì liên quan để tạo thuộc tính mới.

Như một ví dụ, chúng tôi kiểm tra xem email đã được sử dụng trong DB chưa và thêm lỗi vào thuộc tính Email trong hành động để khi tôi quay lại chế độ xem, họ biết rằng có lỗi và cách hiển thị bằng cách sử dụng

<%: Html.ValidationSummary(true)%>
<%: Html.ValidationMessageFor(model => model.Email) %>

ModelState.AddModelError("Email", Resources.EmailInUse);

1
Điều này có vẻ trái ngược trong trường hợp của tôi - Tôi đang kiểm tra xem liệu một sự kết hợp cụ thể của col1 & col2 đã tồn tại trong cơ sở dữ liệu hay chưa, vì vậy có vẻ như không có thuộc tính IsD repeatateOfAnotherRow trên ViewModel của tôi. Hóa ra, bạn có thể thêm một lỗi vào mô hình của mình - xem câu trả lời của tôi.
Scott Baker

1
Có cách nào để có được chuỗi "Email" cho AddModelError mà không cần sử dụng chuỗi ký tự dễ vỡ không? Giống như (m=>m.email).SomeMagicToString()?
Snekse

Tôi không nghĩ vậy, bạn phải đi với chuỗi ma thuật ... không phải là giải pháp tốt nhất nhưng vẫn là một giải pháp tốt
VinnyG

4
Các nameofnhà điều hành sắp tới trong C # 6.0 phá được chuỗi vấn đề kỳ diệu này. msdn.microsoft.com/en-us/magazine/dn802602.aspx
RJ Cuthbertson

3

Đặt thuộc tính dấu chấm mô hình trong chuỗi làm việc cho tôi: ModelState.AddModelError("Item1.Month", "This is not a valid date");


2
Điều đó thực sự sẽ hiển thị một tháng không hợp lệ trong giao diện người dùng của bạn, nhưng nó không giải quyết được vấn đề ban đầu.
Scott Baker

2
Vấn đề ban đầu xuất phát từ việc không hiểu "key" thể hiện điều gì trong phương thức. Điều này làm sáng tỏ về cách các chức năng "khóa", vì vậy thật tốt khi biết rằng khóa đó không phải chỉ là một tên thuộc tính, mà còn có thể tham chiếu đến các thuộc tính lồng nhau hoặc giá trị đặc biệt String.Empty.
Triynko
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.