2013-01-23 3 views
0

환경 :
MVC4, Razor 2 및 FluentValidation.MVC4 (3.4.6.0)를 사용 중입니다.FluentValidation에서 하위 오류를 부모에게 전파하십시오.

시나리오 :

public class ProfileViewModel 
{ 
    public string FirstName {get; set;} 
    public PhoneNumberViewModel Primary {get; set;} 
    // ... other stuff ... // 
} 

public class PhoneNumberViewModel 
{ 
    public string AreaCode { get; set; } 
    public string Exchange { get; set; } 
    public string Suffix { get; set; } 
    public string Extension { get; set; } 
} 

이 프로필을 편집하고 다시 업데이트에 대한 게시 될 수 있습니다
나는 다음과 같이 또한에 아이 뷰 모델을 가지고 특정 페이지에 대한 복잡한 뷰 모델을 가지고있다. 다음 두 가지 모두에 대해 Fluent Validators를 만들었습니다.

public class ProfileViewModelValidator : AbstractValidator<ProfileViewModel> 
{ 
    public ProfileViewModelValidator() 
    { 
     RuleFor(m => m.FirstName).NotEmpty().WithMessage("Please enter a First Name,"); 
     RuleFor(m => m.Primary).SetValidator(new PhoneNumberViewModelValidator()).WithMessage("Hello StackOverflow!"); 
     // ... other validation ... // 
    } 
} 

public class PhoneNumberViewModelValidator : AbstractValidator<PhoneNumberViewModel> 
{ 
    public PhoneNumberViewModelValidator() 
    { 
     RuleFor(m => m.AreaCode).NotEmpty(); 
    }  
} 

그런 다음 모든 것을 표시 할보기가 있습니다.

프로필보기 발췌문 :

... 
@Html.TextBoxFor(m => m.FirstName) 
@Html.EditorFor(m => m.PrimaryPhoneNumber) 
... 

전화 번호 편집기 템플릿 코드 조각 :

... 
@Html.ValidationLabelFor(m => m, "Primary Phone:") 
@Html.TextBoxFor(m => m.AreaCode) 
@Html.TextBoxFor(m => m.Exchange) 
@Html.TextBoxFor(m => m.Suffix) 
@Html.TextBoxFor(m => m.Extension) 
@Html.ValidationMessageFor(m => m) 
... 

이 관련이 있다면, 내가 설정 한 물건을 가지고있는 다양 한 개체가 자동으로 선까지 검증을되도록. 실제로 위의 .SetValidator() 줄이 필요하지 않습니다 ... 모든 것이 와이어로 인해 유효하게 처리됩니다.

목적 : 나는 이름을 입력하지 않으면
, 내가 ValidationMessageFor에 의해 생성 된 영역 위에 제공된 오류 메시지가 표시됩니다. 그러나 자식 PhoneNumberViewModel의 요소 중 하나라도 유효성 검사에 실패하면 아무 것도 얻지 못합니다. 텍스트 상자가 빨간색으로 강조 표시되어 환상적이지만 내 자식 속성이 유효하지 않음을 나타내는 .WithMessage()에 제공된 메시지를받지 못했습니다.

현재 내 컨트롤러에서 추가 작업을 통해이를 달성하고 있습니다 ... 자식 개체에서 오류를 찾아 부모 개체에 오류를 추가합니다. 이 접근법은 정말 나쁜 냄새를 풍깁니다. 컨트롤러에 유효성 검사와 관련한 문제가 있습니다. 말할 것도없이 문자열로 색인 생성을 많이하여 ModelState를 파고 들며 결국은 총체적입니다.

유효성 검사에 실패 할 경우 ProfileViewModel에 오류를 추가하는 ProfileViewModelValidator에 대한 유효성 검사 규칙을 정의하는 간단한 방법이 있습니까? 그리고/또는 그것이 작동해야하지만, 내가 뭔가 잘못하고있는거야? 검색하고 검색했지만 만족스러운 해결책을 찾을 수 없습니다.

시간 내 주셔서 감사합니다.

답변

0

나는 내 질문에 포함 된 냄새 나는 해결책과 다른 해결책을 발견했다. 그것은 또한 이상적이지 못하지만, 위에 제공된 해결책보다 선호한다고 생각합니다. 아마도 다른 사람들도 동의 할 것이기 때문에 더 깨끗한 답이 올 때까지 유용 할 것입니다.

나는 형식화 된 문자열로 전체 전화 번호를 반환 PhoneNumberViewModel에 속성을 추가 : 그런 다음 구성 요소 속성의 각 규칙에 추가하여이 속성에 유효성 검사 규칙을 적용 할 수 있습니다

public string FullNumber 
{ 
    get { return string.Format("{0}{1}{2}{3}", AreaCode, Exchange, Suffix, Extension); } 
} 

.만 FullNumber 속성에 적용하면 예상되는 유효성 확인 메시지 (한 번만 표시됨)와 오류가있는 경우 각 상자의 텍스트 상자가 강조 표시됩니다.

이 접근법의 주요 단점은 최종 사용자가 유효성 검사 규칙을 복제한다는 것입니다. 각 구성 요소의 유효성을 개별적으로 확인한 다음 결합 속성을 검증해야합니다. 이는 기본적으로 이미 수행 한 유효성 검사의 조합입니다. 코드를 두 배로 만들고 처리량을 두 배로 늘릴 수 있습니다. 무엇인가 잘못 될 수있는 장소의 양을 두 배로 늘리고 있습니다.

제 경우에는 정규 표현식을 사용하므로 너무 나쁘지는 않습니다 ... 그리고 컨트롤러에 오류 전파 코드를 포함하는 것이 훨씬 좋습니다. 여전히 이상적이지는 않습니다. 더 나은 해결책이 나오기를 바랍니다.

+0

내 자신보다 덜 이상적인 솔루션을 수락하기 전에 일주일 정도 기다렸습니다. 궁극적으로 최고의 솔루션은 자동 검증 와이어 제거를 제거하고 항상 수동으로 유효성 검사를 설정하는 것입니다. 슬프게도이 경우 나를위한 옵션이 아닙니다. – Mir