[C#] ModelState.IsValid == false, 그 이유는 무엇입니까?

ModelState를 유효하지 않게 만드는 오류 목록은 어디에서 찾을 수 있습니까? ModelState 개체에 오류 속성이 표시되지 않았습니다.



답변

“오류 0 개 및 IsValid == false 일 수 있음”정보 : https://github.com/Microsoft/referencesource/blob/master/System.Web/ModelBinding/ModelStateDictionary.cs#L37-L41 의 MVC 소스 코드입니다.

public bool IsValid {
    get {
        return Values.All(modelState => modelState.Errors.Count == 0);
    }
}

이제 그럴 수없는 것 같습니다. 음, ASP.NET MVC v1입니다.


답변

Visual Studio에서 프로그래밍 할 것이므로 쉬운 디버깅 단계에 중단 점을 사용할 수있는 가능성을 활용하는 것이 좋습니다 (귀하의 경우 문제가 무엇인지 파악). ModelState.isValid를 확인하고 ModelState 위로 마우스를 가져 가기 만하면됩니다. 이제 내부의 모든 값을 쉽게 찾아보고 어떤 오류로 인해 isvalid가 false를 반환하는지 확인할 수 있습니다.

모델 상태


답변

컨트롤러의 ActionResult에 아래 코드를 붙여넣고이 지점에 디버거를 배치합니다.

var errors = ModelState
    .Where(x => x.Value.Errors.Count > 0)
    .Select(x => new { x.Key, x.Value.Errors })
    .ToArray();


답변

bool hasErrors =  ViewData.ModelState.Values.Any(x => x.Errors.Count > 1);

또는 반복

    foreach (ModelState state in ViewData.ModelState.Values.Where(x => x.Errors.Count > 0))
    {

    }


답변

때때로 바인더에서 오류 메시지없이 예외가 발생합니다. 다음 스 니펫으로 예외를 검색하여 무엇이 잘못되었는지 찾을 수 있습니다.

(종종 바인더가 문자열을 복합 유형 등으로 변환하려는 경우)

 if (!ModelState.IsValid)
            {
var errors = ModelState.SelectMany(x => x.Value.Errors.Select(z => z.Exception));

// Breakpoint, Log or examine the list with Exceptions.

  }


답변

ModelsState.IsValid에 대한 검사를 제거하고 오류가 발생하도록하는 경우이 줄을 복사 ((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors하여 Visual Studio의 감시 섹션에 붙여 넣으면 오류가 정확히 무엇인지 알 수 있습니다. 오류가있는 위치를 확인하는 데 많은 시간을 절약합니다.


답변

컨트롤러의 ModelState 속성은 실제로 ModelStateDictionary 개체입니다. 사전의 키를 반복하고 IsValidField 메서드를 사용하여 특정 필드가 유효한지 확인할 수 있습니다.