나는 실제로 FluentValidationModelMetadataProvider를 사용하는 것이 좋습니다 않을 것 - 이것은 단지 정말 지금까지 (아주 잘 다음 릴리스에서 제거 될 수 있습니다) 실험 또한이었으며, 클래스 중 하나를 지원하지 않습니다 (DisplayColumn과 같은) 수준의 DataAnnotations. 검증을 위해서만 FluentValidation을 사용하는 것이 좋지만 메타 데이터에 대한 속성을 고수하는 것이 좋습니다.
당신이 정말로이 다음 작업을 얻을하려는 경우 말했다되는, 당신은 사용자에게 메타 데이터만을 위해 사용되는 어떤 조합 검사기 사용하지으로 구현할 수 :
public static class MetadataExt {
public static IRuleBuilderOptions<T, TProperty> DisplayColumn<T, TProperty>(this IRuleBuilder<T, TProperty> rule) {
var ruleBuilder = (FluentValidation.Internal.RuleBuilder<T, TProperty>)rule;
ruleBuilder.Rule.AddValidator(new DisplayColumnWrapper(ruleBuilder.Rule.PropertyName));
return ruleBuilder;
}
public class DisplayColumnWrapper : NoopPropertyValidator, IAttributeMetadataValidator {
private string name;
public DisplayColumnWrapper(string name) {
this.name = name;
}
public override IEnumerable<ValidationFailure> Validate(PropertyValidatorContext context) {
return Enumerable.Empty<ValidationFailure>();
}
public Attribute ToAttribute() {
return new DisplayColumnAttribute(name);
}
}
}
... 당신은 다음처럼 사용할 수 이 :
public class ExtendedFVModelMetadataProvider : FluentValidationModelMetadataProvider {
IValidatorFactory _validatorFactory;
public ExtendedFVModelMetadataProvider(IValidatorFactory validatorFactory)
: base(validatorFactory) {
this._validatorFactory = validatorFactory;
}
public override ModelMetadata GetMetadataForType(Func<object> modelAccessor, Type modelType) {
var validator = _validatorFactory.GetValidator(modelType);
if (validator == null) {
return base.GetMetadataForType(modelAccessor, modelType);
}
// Only look for the DisplayColumnWrapper
// There is a mismatch as MVC expects this to be defined at class-level, but FV defines everything at the property level.
var displayColumns = from memberWithValidator in validator.CreateDescriptor().GetMembersWithValidators()
from propertyValidator in memberWithValidator
let wrapper = propertyValidator as MetadataExt.DisplayColumnWrapper
where wrapper != null
select wrapper.ToAttribute();
var displayColumn = displayColumns.FirstOrDefault();
// we found a displaycolumn, so pass it over to MVC to build the metadata.
if (displayColumn != null) {
return CreateMetadata(new[] { displayColumn }, null /* containerType */, modelAccessor, modelType, null /* propertyName */);
}
return base.GetMetadataForType(modelAccessor, modelType);
}
}
:
public class Validator : AbstractValidator<SomeModel> {
public Validator() {
RuleFor(x => x.DisplayColumnProperty)
.DisplayColumn();
}
}
그런 다음이를 처리하는 방법을 알고있는 사용자 정의 ModelMetadataProvider를 만들 필요 했어
공급자는 GetMetadataForModel 메서드를 재정 의하여 DisplayColumn을 사용하는 모든 속성을 찾습니다. 다른 사용자 정의 메타 데이터 확장도 지원하려는 경우이 옵션을 확장 할 수 있습니다. 그런 다음 FluentValidation과 함께 제공되는 메타 데이터 공급자 대신이 공급자를 사용할 수 있습니다.
그러나이 방법은 권장하지 않습니다 ... 라이브러리는 UI 메타 데이터 생성을위한 것이 아니라 유효성 검사를 수행하도록 설계되었습니다.
1 년 후에도 규칙에 따라이 메타 데이터 공급자가 유용 할 수 있습니다. http://haacked.com/archive/2011/07/14/model-metadata-and-validation-localization-using-conventions.aspx – Luciano