Professional ASP.NET MVC 1.0 의 NerdDinner 예제에는 복사 된 벨로우즈 (무료 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);
}
답변
ModelState.IsValid
모델 오류가 추가되었는지 알려줍니다 ModelState
.
기본 모델 바인더는 기본 유형 변환 문제에 대해 몇 가지 오류를 추가합니다 (예 : “int”인 경우 숫자가 아닌 값을 전달 함). 사용중인 유효성 검사 시스템에 따라 ModelState를 더 완전하게 채울 수 있습니다.
샘플 DataAnnotations
모델 바인더는 모델의 DataAnnotations
속성에서 가져온 유효성 검사 오류로 모델 상태를 채 웁니다 .
답변
에라타에서 :
ModelState.AddRuleViolations(dinner.GetRuleViolations());
해야한다:
ModelState.AddModelErrors(dinner.GetRuleViolations());
답변
예, Jared와 Kelly Orr가 옳습니다. 편집 예외와 같은 다음 코드를 사용합니다.
foreach (var issue in dinner.GetRuleViolations())
{
ModelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
}
대신에
ModelState.AddRuleViolations(dinner.GetRuleViolations());
답변
유형이 명확한 모든 모델 필드는 Controller로 반환 될 때 유효성을 검사해야합니다. 모델 필드가 정의 된 유형과 일치하지 않으면 ModelState.IsValid는 false를 반환합니다. 이러한 오류는 ModelState에 추가되기 때문입니다.