programing tip

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

itbloger 2020. 6. 16. 20:36
반응형

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


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

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 클래스가 추가됩니다.


<% ViewData.ModelState.IsValid %>

또는

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

특정 속성에 대해 ...

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

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

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

@ChrisMcKenzie의 답변의 요약 버전 :

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

쉼표로 구분하여 모든 오류가있는 하나의 문자열을 제공합니다.

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

감사합니다 차드! 키와 관련된 모든 오류를 표시하기 위해 내가 생각해 낸 내용은 다음과 같습니다. 어떤 이유로 기본 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();
    }

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

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

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

enter image description here


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

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

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"의 유형입니다.

참고 URL : https://stackoverflow.com/questions/573302/how-do-i-get-the-collection-of-model-state-errors-in-asp-net-mvc

반응형