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


120

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

답변:


45

"오류 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입니다.


그것은 나에게 그것은 Values.All (modelState => modelState.Errors.Count == 0)에서 뭔가 잘못 되었습니까?
Omu

오류는 메시지 또는 예외 일 수 있습니다. 예를 들어 Html.ValidationSummary는 예외를 표시하지 않습니다 (보안상의 이유로 추측). 그래서 오류가 보이지 않습니까? 오류가 없는지 어떻게 확인합니까?
queen3 2009.11.24

1
ModelState.IsValid가 거짓 제공
Omu

하하, 당연하다 ... "값에 오류가 없음"을 어떻게 확인합니까?
queen3

258

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

모델 상태


3
모든 값에 오류가 0이고 modelstate가 여전히 유효하지 않을 수 있습니까?
Omu

위에서 말했듯이 이것은 불가능합니다 :). 어딘가는 오류 개수 여야합니다! = 0.
bastijn

2
추가 기능으로 ErrorMessage가 모호한 경우 키로 이동하여 참조하는 변수를 표시 할 수 있습니다.
Luminous

1
보기에서 다음을 수행하십시오. @ Html.HiddenFor (model => model.Username)이 문제를 해결합니다!
Umit Kaya 2015 년

1
var asdf = ModelState.Values.Where(v => v.Errors.Count > 0);당신을 도울 수
Cirelli94

37

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

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

3
여기서 가장 좋은 답변은 더 높은 등급이어야합니다. 오류를 제거 할 수 있는데 디버거에서 ModelState 개체의 5 개 계층을 파헤치는 데 시간을 소비하는 이유는 무엇입니까? 내가 가장 높은 평점 대답 따른다면 나는이 모든 아침 것
숀 T

2
이것은 최고입니다
장난감

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

또는 반복

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

    }

모든 값에 오류가 0이고 modelstate가 여전히 유효하지 않을 수 있습니까?
Omu

1
modelstate는 "Property"키와 사전에 관련 오류를 갖게됩니다. 오류 메시지는 비어있을 수 있지만 오류 수는 유효하지 않은 속성 수를 반영합니다. ModelStateDictionary.AddModelError 메서드는 키와 예외 또는 오류 문자열을 사용하기 때문입니다. 모델 오류를 추가해야합니다.
Michael G

13

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

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

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

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

  }

1
이 코드는 나에게 매우 유용했지만 각 .Message를 얻기 위해 오류 (예외)를 반복하면 "개체 참조가 개체의 인스턴스로 설정되지 않음"이 발생했습니다. z.Exception을 z.ErrorMessage로 변경했을 때 오류 메시지를 표시 할 수있었습니다.
StackOverflowUser

이것은 나를위한 해결책이었습니다 .z.ErrorMessage로 변경했지만 z.Exception으로 오류가 발생하지 않았지만 null 값 만 있습니다. 원래 답변을 업데이트 할 가치가있을 것입니다.
esp

5

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


1
정말 유용한 팁.
애쉬

이것은이 스레드에서 가장 좋은 조언입니다. 내가 가진 문제는 어리석은 "." (점) in UserName
mangia

3

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


3

나에게 일어난 것처럼-이것은 양식을 업데이트하지 않고 모델에 필수 속성을 추가 할 때도 발생할 수 있습니다. 이 경우 ValidationSummary는 오류 메시지를 나열하지 않습니다.


1
이것은 나에게 일어난 일입니다. 팁을위한 Thx!
Lewis86
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.