2009-11-23 3 views
5

을 사용하여 2 개의 목록을 검증하고 아래의 질문에 대한 아이디어가 있으면 도움을받을 수 있습니다.[FluentValidation]에 대한 경험이 많은 사람이라면 FluentValidation

두 개의 일반 목록 (둘 다 문자열 데이터 유형 포함) - "이름"및 "URL"이 있습니다. 둘 다 동일한 양의 항목을 가지므로 색인 된 항목이 일치합니다. 즉 Names [0]은 Urls [0]과 관련됩니다.

유일한 문제는 각 목록에서 빈 항목을 확인하는 것입니다. 필요한 규칙은 다음과 같습니다.

이름 [2]에서 항목이 비어 있고 URL [2]가 비어 있으면 안됩니다. 항목이 URL [2]에서 비어 있고 이름 [2]가 비어 있으면 안됩니다. 둘 다 비어 있으면 유효성을 검사하지 않으므로 무시하고 싶습니다. ,

RuleFor(f => f.Names).Must(d => d.All(s => !String.IsNullOrEmpty(s))) 
       .WithMessage("Names cannot be empty.") 

RuleFor(f => f.URLs).Must(urls => urls.All(s => !String.IsNullOrEmpty(s))) 
       .WithMessage("URLs cannot be empty.") 

이 더 항목 중 하나를 목록에 빈 없는지 확인 :

참고 : 지금까지 내가 가지고있는 나는 위의 예에서 인덱스 2를 사용하고 있지만, 아무것도

이 될 수 그러나 하나의 목록에서 비어있는 항목의 유효성을 검사 할 수 없도록하려면 다른 항목의 상관 관계 항목도 비어 있어야합니다 (둘 다 비어 있으면 무시할 수 있어야 함).

아이디어가 있으십니까?

답변

8

나는 그것이 자신의 의사 코드 :

RuleFor(f => f.Names).Must((f, d) => 
      { 
       for (int i = 0; i < d.Count; i++) 
       { 
        if ((String.IsNullOrEmpty(d[i]) && 
         !String.IsNullOrEmpty(f.URLs[i]))) 
         return false; 
       } 

       return true; 
      }) 
      .WithMessage("Names cannot be empty."); 

      RuleFor(f => f.URLs).Must((f, u) => 
      { 
       for (int i = 0; i < u.Count; i++) 
       { 
        if ((String.IsNullOrEmpty(u[i]) && 
         !String.IsNullOrEmpty(f.Names[i]))) 
         return false; 
       } 

       return true; 
      }) 
      .WithMessage("URLs cannot be empty."); 
+1

게시 해 주셔서 감사합니다. 나는 머리카락을 꺼내고 있었다. 체크 박스가 체크되어 있는지 확인하는 것이 좋습니다 :'RuleFor (x => x.AvailableCompanies) .Must ((f, d) => {return d.Find (h => h.Checked == true)! = null;}) WithMessage ("적어도 하나의 회사를 선택하십시오"); – brenjt

1

다음은 무차별 대입 솔루션의 의사 코드입니다. (나는 LINQ 방식으로 인덱싱 된 비교를 할 수 없다) Fluent 구문을 푸는 것에 대해 사과드립니다.

Must(Names.Length == URLs.Length).WithMessage("Names must be equal in size to URLs"); 
for (int i = 0; i < Name.Length; i++) 
{ 
    Must(string.IsNullOrEmpty(Names[i]) ^^ string.IsNullOrEmpty(URLs[i])).WithMessage("Either Name and URL must be non-empty, or both must be empty, index = " + i); 
} 

는 희망이 당신이 그것의 요점을 얻을, 당신은 또한 일반 LINQ 방법을 조사 할 수 있습니다, 내가 놓친 것 하나가있다. 기본적으로 조인을하고 병합 된 목록에서 잘못된 결과가 있는지 확인하고 싶지만 다시 행을 하나씩 수행하는 방법은 확실하지 않으며 단순히 여러 개를 여러 개 조인하는 것이 아닙니다. , 주셔서 감사합니다 가성을 :

+0

@Guvante에서 영감을받은대로 Guvante에 각 목록에서 corrosponding 항목, 큰 감사를 확인하려면 다음 FluentValidation 코드를 사용하여 종료 코드가 볼을 올바른 방향으로 굴립니다 (게시 된 답변 참조). +1 : – Scozzard

관련 문제