0

요약하면 데이터베이스 필드를 기반으로 런타임에 인스턴스 별 데이터 주석 특성을 만들려고합니다. 지금 내가 초기 모델을 만드는 데는 문제가 없지만 모델이 게시되고 서버 유효성 검사가 수행 될 때 넘어집니다.MVC : 데이터베이스를 사용하여 유효성 검사 속성 또는 대안을 구동하는 방법?

(동일한 입력 모델이 뷰 모델 내의 컬렉션에서 사용되고 있지만 컬렉션의 각 인스턴스에 다른 유효성 검사가 적용되어야합니다. 예를 들어 입력의 첫 번째 항목은 1-100의 범위이지만 같은 모델의 다음 발생은 동일한 입력 페이지에서 1000-2000의 범위가되며 다른 날짜는 6 자 여야합니다. ....)

내 문제는 여기서 내가 무슨 짓을했는지와 설명하겠습니다 :

내가 DataAnnotationsModelMetadataProvider을 상속의 내 자신의 구현을 제공 한 내가 DataAnnotationsModelValidatorProvider을 상속 GetValidators의 외관 구현을 제공 한

(이 아직 .... 검증 문제에 어떤 관계가 없습니다). 여기서 내가하고 싶은 일은 데이터베이스 레코드를 기반으로 새로운 속성을 만든 다음 해당 속성을 기본 구현으로 전달하여 유효성 검사기가 그에 따라 생성되도록하는 것입니다.

그러나 ...... GetValidators은 PROPERTY 수준에서 호출됩니다 ... validynator를 적용하려는 propertyname과 함께 호출 될 때이 propertyname에 해당하는 DB 레코드를 찾아야합니다. 내가 만들 필요가 어떤 속성을 찾을 수 있습니다 ....하지만 ... 가치 필드의 단지 propertyname에서 DB 레코드의 키를 얻을 수 없습니다 ..... 사실, DB 키는 부모 모델에 있습니다 ..... 그래서 어떻게 잡을 수 있니?!

정적 변수 (YUK)를 사용하여 하나의 속성에 대한 호출 중에 키를 저장하고 값 필드 속성에 대한 다른 호출 중에 해당 키를 검색해 보았습니다. 그러나 모델이 단방향으로 직렬화되기 때문에 그리고 필자가 요구하는 속성과 동기화가되지 않는 키로 끝나는 반대의 방식을 역 직렬화했다.

약간의 복잡성을 추가하려면 맞춤 모델 바인더도 사용하고 있습니다. 여기에 다른 곳에서 권고 한대로 CreateModel을 재정의했지만 메타 데이터 또는 추가 값을 출력 모델의 속성에 추가하는 방법을 찾을 수 없습니다 .... 모델 자체에만 .... 어떻게해야합니까? PROPERTY에 대한 GetValidators 호출 내의 MODEL 메타 데이터/추가 값?

그래서 .... 내 질문

1) 사람이 내 ValidationProvider 내 GetValidators 방법에 내 사용자 정의 모델 바인더에서 내 데이터베이스 키를 얻을 수 있도록 할 수 ..... 두 가지이다? 아니면 내 사용자 지정 메타 데이터 공급자를 사용하고 있습니까?

2) 데이터베이스 레코드를 기반으로 런타임에 유효성 검사기를 만드는 다른 방법이 있습니까?

+0

빠른 Google 검색; 이게 당신이 원하는대로 할거에요? http://fluentvalidation.codeplex.com/wikipage?title=mvc – user1477388

+0

FluentValidation을 살펴 보았지만 같은 문제가 발생했습니다 ... 데이터베이스 필드에서 가져온 동적 값을 사용하여 "RuleFor"를 어떻게 작성합니까? 나는 인스턴스별로 그것을하는 방법을 볼 수 없었다. 또한 엔터프라이즈 유효성 검사 블록을 살펴 보았지만 다시 ... ... 모델 별이 아닌 인스턴스 별 규칙이 필요합니다 ...... –

+1

@DaveR - 혼란 스럽네요. 속성은 인스턴스가 아닌 유형에 적용됩니다. 그것들은 코드로 컴파일되므로, 컴파일 타임에 정의되고 런타임에는 정의되지 않습니다. –

답변

0

저는 FluentValidation forums에 대해서도 물었습니다. 여기에 대한 답변이 부족하고 거기에서 Fluent를 사용하는 것에 대한 조언은 저 자신의 해결책을 찾도록 이끌었습니다. (나는 이것이 거의 확실하게 내가 뭔가 나쁜 일을한다는 것을 의미한다는 것을 이해합니다./비정상적인/불필요한!)

내가 한 일을 끝내면 사용자 지정 모델 바인더의 CreateModel 메서드에서 내 컨트롤러 정적 변수를 할당하는 것입니다.이 메서드는 사용자 지정 모델을 통해 수행하려고하지 않고 전체 클라이언트 모델에 액세스 할 수 있습니다 MetaDataProvider. 이것은 잘 작동하는 것 같아 내 애플 리케이션의 V1에 나를 잡아.

리팩토링하는 사람이이 전체 영역을 앞으로 몇 달 동안 보게 될 것이지만 나는이 솔루션에 만족하지 않습니다. 그렇기 때문에 사람들이 일반적인 방식으로 동적 유효성 검사를 구현하는 방법에 대한 다른 의견이나 아이디어를 고맙게 생각할 것입니다.

1

나는 이것이 당신이 필요로하는 것보다 훨씬 더 복잡하게 만들고 있다고 생각합니다. 유효성 검사 기준 선택기가 뷰 모델의 일부인지 만 확인하면됩니다. 반드시 표시 할 필요는 없습니다 (포스트 백 목적으로 보관해야하는 경우 hiddens에 저장할 수 있습니다).

그럼 당신은 같은 기준에 해당하는 속성이 특정 범위로있을 때 당신이 선택하는 데 사용할 어떤 값입니다

RuleFor(model => model.myprop) 
    .When(model => model.criteria == whatever) 
    .GreaterThan(100) 
    .LessThan(1000); 

말 규칙을 만들 FluentValidation 같은 것을 사용할 수 있습니다.

그렇다면 유효성 검사 규칙 선택에 사용되는 기준을 포함하도록보기 모델을 작성해야합니다.

+0

+1 물건을 단순화하는 방법 – user1477388

+0

나는 이것이 잠재적 인 것을 알 수있다. 나는 그것을 파고 들며 더 깊이 조사 할 것이다. –

0

저는 이것이 오래된 질문이라는 것을 압니다 만, 저는 많은 사람들이 이것으로부터 도움을받을 수 있도록 이것을 대답하고 있습니다.

Loading C# MVC .NET Data Annotation Attributes From XML, Form Validation

난 당신이 같은 접근 방식을 따를 수 대신 XML에서 읽는 당신이 데이터베이스에서 읽고 이러한 규칙을 추가 할 수 있다고 생각하는 XML에서 속성을로드하는 아래 문서를 참조하십시오 동적 모델 데이터 유형에 따라

당신은 아래 방법을 참조 할 수도

DataAnnotations dynamically attaching attributes