[asp.net-mvc] ASP.Net MVC modelState에서 모든 오류를 얻는 방법?

키 값을 몰라도 modelState에서 모든 오류 메시지를 가져오고 싶습니다. ModelState에 포함 된 모든 오류 메시지를 가져 오기 위해 반복합니다.

어떻게해야합니까?



답변

foreach (ModelState modelState in ViewData.ModelState.Values) {
    foreach (ModelError error in modelState.Errors) {
        DoSomethingWith(error);
    }
}

ASP.NET MVC에서 모델 상태 오류 모음을 얻는 방법을 참조하십시오 . .


답변

LINQ 사용 :

IEnumerable<ModelError> allErrors = ModelState.Values.SelectMany(v => v.Errors);


답변

모든 오류 메시지를 하나의 문자열로 결합하려는 경우 LINQ 버전을 기반으로합니다.

string messages = string.Join("; ", ModelState.Values
                                        .SelectMany(x => x.Errors)
                                        .Select(x => x.ErrorMessage));


답변

약간의 LINQ를 사용하여이 작업을 수행 할 수있었습니다.

public static List<string> GetErrorListFromModelState
                                              (ModelStateDictionary modelState)
{
      var query = from state in modelState.Values
                  from error in state.Errors
                  select error.ErrorMessage;

      var errorList = query.ToList();
      return errorList;
}

위의 메서드는 유효성 검사 오류 목록을 반환합니다.

추가 자료 :

ASP.NET MVC에서 ModelState의 모든 오류를 읽는 방법


답변

디버깅하는 동안 모든 ModelState 오류를 표시하기 위해 각 페이지의 맨 아래에 테이블을 배치하는 것이 유용하다는 것을 알았습니다.

<table class="model-state">
    @foreach (var item in ViewContext.ViewData.ModelState)
    {
        if (item.Value.Errors.Any())
        {
        <tr>
            <td><b>@item.Key</b></td>
            <td>@((item.Value == null || item.Value.Value == null) ? "<null>" : item.Value.Value.RawValue)</td>
            <td>@(string.Join("; ", item.Value.Errors.Select(x => x.ErrorMessage)))</td>
        </tr>
        }
    }
</table>

<style>
    table.model-state
    {
        border-color: #600;
        border-width: 0 0 1px 1px;
        border-style: solid;
        border-collapse: collapse;
        font-size: .8em;
        font-family: arial;
    }

    table.model-state td
    {
        border-color: #600;
        border-width: 1px 1px 0 0;
        border-style: solid;
        margin: 0;
        padding: .25em .75em;
        background-color: #FFC;
    }
 </style>


답변

지금까지 주어진 답변에서 조언을 따랐다는 것을 알았으므로 오류 메시지를 설정하지 않고 예외가 발생하여 ErrorMessage와 Exception을 얻는 데 실제로 필요한 모든 문제를 잡을 수 있습니다.

String messages = String.Join(Environment.NewLine, ModelState.Values.SelectMany(v => v.Errors)
                                                           .Select( v => v.ErrorMessage + " " + v.Exception));

또는 확장 방법으로

public static IEnumerable<String> GetErrors(this ModelStateDictionary modelState)
{
      return modelState.Values.SelectMany(v => v.Errors)
                              .Select( v => v.ErrorMessage + " " + v.Exception).ToList();

}


답변

누구나 오류 메시지를 강력한 형식의보기로 바인딩하기 위해 Model 속성 이름을 반환하려는 경우.

List<ErrorResult> Errors = new List<ErrorResult>();
foreach (KeyValuePair<string, ModelState> modelStateDD in ViewData.ModelState)
{
    string key = modelStateDD.Key;
    ModelState modelState = modelStateDD.Value;

    foreach (ModelError error in modelState.Errors)
    {
        ErrorResult er = new ErrorResult();
        er.ErrorMessage = error.ErrorMessage;
        er.Field = key;
        Errors.Add(er);
    }
}

이렇게하면 실제로 오류를 던진 필드와 오류를 묶을 수 있습니다.