ASP.NET MVC에서 모델 상태 오류 수집을 어떻게 얻습니까?


145

뷰에서 오류 수집을 어떻게 얻습니까?

HTML 도우미 유효성 검사 요약 또는 유효성 검사 메시지를 사용하고 싶지 않습니다. 대신 오류를 확인하고 특정 형식으로 오류가 표시되는지 확인하고 싶습니다. 또한 입력 컨트롤에서 특정 속성 오류를 확인하고 입력에 클래스를 추가하려고합니다.

추신 : 나는 Spark View Engine을 사용하고 있지만 아이디어는 동일해야합니다.

그래서 나는 다음과 같은 일을 할 수 있다고 생각했습니다 ...

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

....and also...

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

....

아니면 그런 것.

최신 정보

내 최종 솔루션은 다음과 같습니다.

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

이 속성에 오류가있는 경우에만 오류 CSS 클래스가 추가됩니다.


답변:


210
<% ViewData.ModelState.IsValid %>

또는

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

특정 속성에 대해 ...

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

1
키 이름 ViewData.ModelState [ "이름"] 통과를위한 ModelState 속성은 오류를 얻기 위해 사전 유형 인

"ViewData.ModelState ["Property "]. Errors"와 관련하여 이름이 "Property"인 키가없는 경우 null 참조 예외가 발생합니까? 오류를 읽기 전에 먼저 ViewData.ModelState [ "Property"]에서 null을 확인하는 것이 더 낫습니까?
David Hollowell-MSFT

네 @DaveH, 당신은 완전히 처음 존재를 확인한다
알렉스 리만

61

ModelState에서 오류를 얻으려면이 Linq를 사용하십시오.

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

2
지정된 이름의 키가 없으면 null 참조 예외가 발생합니까? 오류를 읽기 전에 먼저 ViewData.ModelState [key]에서 null을 확인하는 것이 더 낫습니까?
David Hollowell-MSFT

5
우리는 this.ModelState.Keys를 반복하여 시작하기 때문에 KeyNotFoundException의 가능성을 알 수 없습니다. 나는 수표가 과도하다고 생각합니다.
Chris McKenzie


28

이렇게하면 쉼표로 구분하여 모든 오류가있는 하나의 문자열이 제공됩니다.

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

이것이 전체 목록에서 실제로 오류를 인쇄하는 유일한 것입니다! 감사합니다
Jamie

6

감사합니다 차드! 키와 관련된 모든 오류를 표시하기 위해 내가 생각해 낸 내용은 다음과 같습니다. 어떤 이유로 기본 Html.ValidationMessage 도우미는 키와 관련된 첫 번째 오류 만 표시합니다.

    <%= 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();
    }

6

위에서 몇 가지 답변을 종합하면 다음과 같이 사용됩니다.

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

validationErrors결국 List<string>각 오류 메시지가 포함 된입니다. 이 목록에서 원하는 목록을 쉽게 수행 할 수 있습니다.

여기에 이미지 설명을 입력하십시오


2

여기에 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())

0

어떤 속성에서 오류가 발생했는지 모르는 경우 리플렉션을 사용하여 모든 속성을 반복 할 수 있습니다.

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

여기서 T는 "ViewModel"의 유형입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.