2009-02-21 23 views
137

Làm cách nào để có được bộ sưu tập lỗi trong chế độ xem?Làm thế nào để có được bộ sưu tập của lỗi nhà nước Model trong ASP.NET MVC?

Tôi không muốn sử dụng Thông báo xác thực hoặc xác thực trình trợ giúp Html. Thay vào đó, tôi muốn kiểm tra lỗi và nếu có hiển thị chúng ở định dạng cụ thể. Ngoài ra trên các điều khiển đầu vào tôi muốn kiểm tra một lỗi đặc tính cụ thể và thêm một lớp vào đầu vào.

P.S. Tôi đang sử dụng Spark View Engine nhưng ý tưởng phải giống nhau.

Vì vậy, tôi figured tôi có thể làm điều gì đó giống như ...

<if condition="${ModelState.Errors.Count > 0}"> 
    DispalyErrorSummary() 
</if> 

....and also... 

<input type="text" value="${Model.Name}" 
     class="?{ModelState.Errors["Name"] != string.empty} error" /> 

.... 

Hoặc một cái gì đó như thế.

CẬP NHẬT

giải pháp cuối cùng của tôi trông như thế này:

<input type="text" value="${ViewData.Model.Name}" 
     class="text error?{!ViewData.ModelState.IsValid && 
          ViewData.ModelState["Name"].Errors.Count() > 0}" 
     id="Name" name="Name" /> 

này chỉ bổ sung thêm lớp css lỗi nếu khách sạn này có một lỗi.

+1

trùng lặp có thể xảy ra của [Làm thế nào để có được tất cả các lỗi từ ASP.Net MVC ModelState?] (Https://stackoverflow.com/questions/1352948/how-to-get-all-errors-from- asp-net-mvc-modelstate) –

Trả lời

199
<% ViewData.ModelState.IsValid %> 

hoặc

<% ViewData.ModelState.Values.Any(x => x.Errors.Count >= 1) %> 

và cho một tài sản cụ thể ...

<% ViewData.ModelState["Property"].Errors %> // Note this returns a collection 
+0

Câu hỏi - Làm cách nào để tôi gặp lỗi cho một thuộc tính cụ thể? –

+1

thuộc tính ModelState thuộc loại từ điển để nhận lỗi khi truyền tên khóa ViewData.ModelState ["Name"] –

+0

liên quan đến "ViewData.ModelState [" Property "]. nếu không có chìa khóa với tên "bất động sản"? nó sẽ là tốt hơn để đầu tiên kiểm tra null trên ViewData.ModelState ["tài sản"] trước khi đọc trong lỗi? – DaveH

5

Cảm ơn Chad! Để hiển thị tất cả các lỗi liên quan đến khóa, đây là những gì tôi đã đưa ra. Vì lý do nào đó, trình trợ giúp Html.ValidationMessage cơ sở chỉ hiển thị lỗi đầu tiên được liên kết với khóa.

<%= Html.ShowAllErrors(mykey) %> 

HtmlHelper:

public static String ShowAllErrors(this HtmlHelper helper, String key) { 
     StringBuilder sb = new StringBuilder(); 
     if (helper.ViewData.ModelState[key] != null) { 
      foreach (var e in helper.ViewData.ModelState[key].Errors) { 
       TagBuilder div = new TagBuilder("div"); 
       div.MergeAttribute("class", "field-validation-error"); 
       div.SetInnerText(e.ErrorMessage); 
       sb.Append(div.ToString()); 
      } 
     } 
     return sb.ToString(); 
    } 
55

Để chỉ nhận được các lỗi từ ModelState, sử dụng LINQ này:

var modelStateErrors = this.ModelState.Keys.SelectMany(key => this.ModelState[key].Errors); 
+2

điều này sẽ ném một ngoại lệ tham chiếu null nếu không có chìa khóa với tên được chỉ định? sẽ tốt hơn nếu trước tiên kiểm tra null trên ViewData.ModelState [key] trước khi đọc trong Lỗi? – DaveH

+4

Bởi vì chúng tôi bắt đầu bằng cách lặp lại trên này.ModelState.Keys, tôi không thấy tiềm năng cho một KeyNotFoundException. Tôi nghĩ rằng kiểm tra sẽ là quá mức cần thiết. –

0

Nếu bạn không biết những gì bất động sản gây ra lỗi, bạn có thể , sử dụng phản chiếu, lặp qua tất cả các thuộc tính:

public static String ShowAllErrors<T>(this HtmlHelper helper) { 
    StringBuilder sb = new StringBuilder(); 
    Type myType = typeof(T); 
    PropertyInfo[] propInfo = myType.GetProperties(); 

    foreach (PropertyInfo prop in propInfo) { 
     foreach (var e in helper.ViewData.ModelState[prop.Name].Errors) { 
      TagBuilder div = new TagBuilder("div"); 
      div.MergeAttribute("class", "field-validation-error"); 
      div.SetInnerText(e.ErrorMessage); 
      sb.Append(div.ToString()); 
     } 
    } 
    return sb.ToString(); 
} 

Trong đó T là loại "ViewModel" của bạn.

28

phiên bản Condensed của @ChrisMcKenzie's answer:

var modelStateErrors = this.ModelState.Values.SelectMany(m => m.Errors); 
22

này sẽ cung cấp cho bạn một chuỗi với tất cả các lỗi với dấu phẩy tách

string validationErrors = string.Join(",", 
        ModelState.Values.Where(E => E.Errors.Count > 0) 
        .SelectMany(E => E.Errors) 
        .Select(E => E.ErrorMessage) 
        .ToArray()); 
2

Đây là VB.

Dim validationErrors As String = String.Join(",", ModelState.Values.Where(Function(E) E.Errors.Count > 0).SelectMany(Function(E) E.Errors).[Select](Function(E) E.ErrorMessage).ToArray()) 
+1

yuck .. vui vì tôi không sử dụng VB;) – cyclical

1

Đưa nhau vài câu trả lời từ trên cao, đây là những gì tôi đã kết thúc bằng:

var validationErrors = ModelState.Values.Where(E => E.Errors.Count > 0) 
    .SelectMany(E => E.Errors) 
    .Select(E => E.ErrorMessage) 
    .ToList(); 

validationErrors kết thúc lên được một List<string> có chứa từng thông báo lỗi. Từ đó, thật dễ dàng để làm những gì bạn muốn với danh sách đó.

enter image description here

Các vấn đề liên quan