2014-12-26 2 views
1

데이터베이스의 값에 따라 특정 요청의 유효성을 검사하려고합니다. 복잡한 시나리오이지만 예제에서이를 단순화하려고 노력할 것입니다. POST 요청이 들어 오면웹 API의 동적 유효성 검사

public class CustomerModel 
{ 
    public int AgencyId { get; set; } 

    public string Name { get; set; } 

    public int Age { get; set; } 
} 

, 내가 AgencyId가 전달되는 대한 특정 요구 사항을 얻기 위해 전화를해야합니다

나는 다음과 같은 모델을 가지고 말.

데이터베이스에서 얻을 수있는 정보는 각 기관마다 다른 속성이 필요한지 알려줍니다. 예를 들어 한 대행사는 이름과 나이가 필요할 수 있으며 다른 대행사는 이름 만 필요할 수 있습니다.

public class Requirement 
{ 
    public string PropertyName { get; set; } 

    public bool IsRequired { get; set; } 
} 

그래서, 내 질문이이 데이터베이스에 제출되기 전에이 모델의 유효성을 확인하는 가장 좋은 방법은 무엇 일 것입니다 : 요구 사항의 목적은 같을까요? 이상적으로, 나는 기관에 이러한 요구 사항을 변경할 수있는 능력을 부여하고 싶습니다. 따라서 가능한 경우 하드 코딩 유효성 검사를 피하고 싶습니다.

첫 번째 생각은 요구 사항 목록을 호출 한 다음 PropertyName으로 검색 한 각 요구 사항에 대해 foreach를 수행 한 다음 값이 있는지 여부를 확인했지만 이것이 최선의 방법인지 여부는 확실하지 않았습니다. .

그런 다음 Data Annotations를 살펴 보았지만 런타임에 특성을 추가하는 방법을 찾지 못했습니다.

+0

이 포럼 사이트와 달리, 우리가 "감사합니다", 또는 "어떤 도움 감사합니다", 또는 서명을 사용하지 않는 if (ModelState.IsValid) 검사와 모델의 유효성을 검사 할 수 properly register your validator

A는 정말 좋은 것입니다 [그래서]. "[안녕하세요, '고마워,'태그 라인 및 인사말을 게시물에서 삭제해야합니까?] (http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be 참조) -removed-from-posts). –

답변

1

당신은 Fluent Validation library를 사용하고 (난 강력하게 조언하는) 프로젝트에서 의존성 주입을 사용하는 경우 사용자 정의 유효성 검사기

public class CustomerModelValidator : AbstractValidator<CustomerModel> 
{ 
    private readonly IRepository _repository; 

    public RegisterModelValidator(IRepository repository) 
    { 
     this._repository= repository; 

     RuleFor(x => x.AgencyId).GreaterThan(0).WithMessage("Invalid AgencyId"); 
     RuleFor(x => x.Age).GreaterThan(0).WithMessage("Invalid Age"); 
     Custom(c => 
       { 
        var requirements = _repository.GetRequirementsForAgency(model.AgencyId); 
        \\validate each property according to requirements object. 
        \\if (Validation fails for some property) 
         return new ValidationFailure("property", "message"); 
        \\else 
        return null; 
       }); 
    } 
} 

을 구현할 수 있습니다, 당신은 속성에 관련 IRepository를 주입해야합니다. 그렇지 않으면 속성에 특정 리포지토리를 만들거나 사용할 수 있습니다. 당신은 당신이 기본

관련 문제