[asp.net-mvc] NerdDinner의 ASP.NET MVC에서 ModelState.IsValid가 유효한 것은 무엇입니까?

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);
} 



답변

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

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

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


답변

에라타에서 :
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


답변

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

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

대신에

ModelState.AddRuleViolations(dinner.GetRuleViolations());


답변

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


답변