NerdDinner의 ASP.NET MVC에서 ModelState.IsValid가 유효한 것은 무엇입니까?


148

Professional ASP.NET MVC 1.0NerdDinner 예제에는 복사 된 벨로우즈 (무료 NerdDinner 버전의 89 페이지)로 새 저녁 식사를 만드는 방법이 있습니다.

거기에서 ModelState.IsValid가 true인지 확인합니다. 모델이 데이터베이스에 유효한지 확인하는 것 같습니다 (즉, 형식이 잘못된 날짜이지만 비즈니스 규칙이 아닌 날짜와 같은 데이터 유형 변환을 잡습니다). 그게 사실입니까?

양식을 제출할 때 날짜에 오류가 있으면 ModelState.IsValid가 false가되고 AddRuleViolations가 실행되지 않았기 때문에 날짜에 대해서만 오류가 발생합니다. ModelState.IsValid에 대한 검사를 완전히 제거하면 유효하지 않은 날짜의 표시를 포함하여 (예외로 인해) 모든 오류가 발생합니다. 그렇다면 왜 ModelState.IsValid 검사가 있습니까? 뭔가 빠졌습니까?

// 
// POST: /Dinners/Create 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create(Dinner dinner) {
    if (ModelState.IsValid) {
        try {
            dinner.HostedBy = "SomeUser"; 

            dinnerRepository.Add(dinner);
            dinnerRepository.Save();

            return RedirectToAction("Details", new {id = dinner.DinnerID }); 
        } catch {
            ModelState.AddRuleViolations(dinner.GetRuleViolations());
        } 
    } 
    return View(dinner); 
} 

답변:


143

ModelState.IsValid 모델 오류가 추가되었는지 알려줍니다 ModelState .

기본 모델 바인더는 기본 유형 변환 문제에 대해 몇 가지 오류를 추가합니다 (예 : "int"인 경우 숫자가 아닌 값을 전달 함). 사용중인 유효성 검사 시스템에 따라 ModelState를 더 완전하게 채울 수 있습니다.

샘플 DataAnnotations모델 바인더는 모델의 DataAnnotations속성에서 가져온 유효성 검사 오류로 모델 상태를 채 웁니다 .


Brad는 ModelState없이 DataAnnotations "IsValid"로 장식 된 모델을 찾을 수있는 방법이 있습니다. (예를 들어 오브젝트가 파일에서로드되거나 콘솔 앱 등에서 사용되는 경우)
runxc1 Bret Ferrier

1
아니요, ModelState.IsValid는 모델 바인딩 중에 유효성 검사 (또는 데이터 변환) 오류가 있는지 확인하는 유일한 방법입니다.
브래드 윌슨

@Brad, "사용중인 유효성 검사 시스템에 따라 ModelState를 더 완벽하게 채울 수 있습니다"라고 말할 때 어떻게 달성됩니까? ViewModel에 대한 ModelState 유효성 검사 코드를 열 수있는 방법이 있습니까? EF4를 사용하고 있으므로 대부분의 유효성 검사는 기본적으로 자동으로 수행됩니다.
WEFX

13
var errors = ModelState.Values.SelectMany(v => v.Errors);유효성 검사 문제를 보려면 중단 점과 함께 사용하십시오 .
full_prog_full

속성 이름이 변경된 경우 마이그레이션이 수행되지 않아 결과적으로 SaveChanges (); 변경으로 인해 실패하고 발생할 수 없습니다.
Oracular Man

25

에라타에서 : ModelState.AddRuleViolations(dinner.GetRuleViolations());

해야한다:

ModelState.AddModelErrors(dinner.GetRuleViolations());

참조 : http://www.wrox.com/WileyCDA/WroxTitle/Professional-ASP-NET-MVC-1-0.productCd-0470384611,descCd-ERRATA.html


5
2015 년 현재이 AddModelErrors방법은 존재하지 않습니다.
Felipe Correa

6
2016 년 현재이 ModelState.AddModelErrors()방법이 존재합니다
John

7
2017 년 현재 비 복수 ModelState.AddModelError방법이 존재합니다.
Zachafer

0

예, Jared와 Kelly Orr가 옳습니다. 편집 예외와 같은 다음 코드를 사용합니다.

foreach (var issue in dinner.GetRuleViolations())
{
    ModelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
}

대신에

ModelState.AddRuleViolations(dinner.GetRuleViolations());

0

유형이 명확한 모든 모델 필드는 Controller로 반환 될 때 유효성을 검사해야합니다. 모델 필드가 정의 된 유형과 일치하지 않으면 ModelState.IsValid는 false를 반환합니다. 이러한 오류는 ModelState에 추가되기 때문입니다.

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