2010-07-21 8 views
1

기본 모델 바인더로 바인딩 된 모델이 있습니다. DataAnnotations.RequiredAttribute 을 기반으로 한 속성을 잘못된 것으로 등록합니다. 동일한 모델의 다른 속성에는 해당 필드에 유효한 값을 가져 와서 설정하는 setter 메서드가 있습니다.ASP.NET MVC 2 - ModelState 재평가

그러나 원래 ModelState 오류가 유지됩니다.
주 질문 : ModelState를 재평가 할 수 있습니까?
Sub 질문 : 더 나은 해결책이 있습니까?

편집
여기 당신이 MainEmail에서 Required를 제거해야합니다, 또는 어쩌면하지 않는이 경우 생각 단순화 (하위 질문에 대한) 구속되는 모델의 예를

public class Booking 
{ 
    public List<Participant> Participants {get;set;} 
    [Required] 
    public string MainEmail {get;set;} 
    private int _mainParticpantIndex; 
    [Required] 
    public int MainParticipantIndex 
    { 
     get { return _mainParticpantIndex; } 
     set 
     { 
      _mainParticpantIndex= value; 
      MainEmail = Particpants[value].Email 
     } 
    } 
} 
public class Participant 
{ 
    // not required for every participant. 
    public string Email {get;set;} 
    [Required] 
    public string Name {get;set;} 
} 
+0

'[필수]'속성을 "setter"속성에 넣을 수 있습니까? 약간의 코드를 제공해 주시겠습니까? 조금 혼란 스럽습니다. –

+0

예, 좋아요, 데모 코드를 추가했습니다. – Myster

답변

1

입니다 그것은 설정 가능하다. 코드의 나머지 부분이 어떻게 작동하는지 잘 모르겠지만, 필자가 볼 때 주 참가자의 이메일 가치도 항상 필요합니다.

메인 이메일을 기본 참가자의 이메일과 다른 것으로 덮어 쓰려는 경우가 아니라면. 이 경우 당신은 아마 당신의 의견을 바탕으로, 당신이 정말로 당신이 정상 Required 속성으로 원하는 것을 할 수없는 편집

MainParticipantIndex

의 세터를 수정해야합니다. MVC 프레임 워크는 '요구 사항'이 다른 객체로 전달되기를 원한다는 것을 알 수있는 방법이 없습니다. 당신은 당신의 규칙을 시행 할 자신 만의 엔티티 레벨 검증을 작성해야 할 것입니다.

+0

문제는 Participant.Email이 필요하지 않다는 것입니다. (의도하지 않은) 주요 참가자를 선택해야하지만, 이메일을 가지고있는 사람을 선택하거나 그들이 선택한 참가자에게 이메일을 보내고 싶습니다. (전자 메일은이 데이터베이스 스키마와 일치하므로 복제됩니다.) _is_ 필수 인 Name을 표시하는 예제를 업데이트했습니다. – Myster

+0

나는 올바른 모델에 대한 요구가 있다고 믿는다. 문제는 modelbinding 중에 평가되고 파생 된 값이 필수 필드에 설정된 후에는 발생하지 않는다는 것이다. – Myster

+0

그래서 모델 바인딩 컨텍스트에서 RequiredAttribute의 정의를 가정한다. 해당 속성이 표시된 각 특성은 모델 바인딩 중에 제공되어야하며 나중에는 제공되지 않아야합니다. 이 정의에 따르면 속성의 사용이 올바르지 않습니다. – marcind