我正在尝试构建一个继承自DefaultModelBinder
的自定义模型绑定器。在此实现中,我想访问验证规则元数据(来自FluentValidation),因为它们包含override the ModelState
error messages所需的信息。
请注意,该链接中的答案对我没有帮助,因为我没有使用资源进行验证消息。消息存储在FluentValidation规则中。正常验证不起作用的原因,类似于该链接中的问题,是因为.NET的模型绑定器接管并设置消息以及将值清空,从而使值有效,只要FluentValidation规则是关注。
我可以让这个工作,只要我可以访问我的模型的验证规则,每个属性和规则。
以下是一个示例模型:
[Validator(typeof(SampleValidator))]
public SampleModel
{
public DateTime SomeDate { get; set; }
public int SomeInt { get; set; }
public decimal SomeDecimal { get; set; }
}
FluentValidation,开箱即用,不提供数据类型的验证,因此我构建了自己的客户端验证器来覆盖验证消息(通过Fluent适配器)。我的问题只是服务器端验证,它由.NET的默认模型绑定器接管,如链接讨论中所述。
我正在尝试从DefaultModelBinder.SetProperty覆盖:
执行此操作protected override void SetProperty(
ControllerContext controllerContext,
ModelBindingContext bindingContext,
System.ComponentModel.PropertyDescriptor propertyDescriptor,
object value)
{
}
这是一个示例验证器。服务器端验证IsValid
总是返回真正的bacuase,如上所述,当输入非日期时,DefaultModelBinder
总是将值覆盖为null:
public class DateValidator : PropertyValidator, IDateValidator
{
public DateValidator()
: base(() => "{PropertyName} must be a date.")
{
}
protected override bool IsValid(PropertyValidatorContext context)
{
return true;
}
}
验证适配器只是将验证器连接到客户端适配器和参数:
public class DateFluentValidationPropertyValidator : FluentValidationPropertyValidator
{
private IDateValidator DateValidator
{
get { return (IDateValidator)Validator; }
}
public DateFluentValidationPropertyValidator(ModelMetadata metadata, ControllerContext controllerContext, PropertyRule rule, IPropertyValidator validator)
: base(metadata, controllerContext, rule, validator)
{
ShouldValidate = false;
}
public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
{
if (!ShouldGenerateClientSideRules()) yield break;
var formatter = new MessageFormatter().AppendPropertyName(Rule.GetDisplayName());
string message = formatter.BuildMessage(DateValidator.ErrorMessageSource.GetString());
yield return new ModelClientValidationRule
{
ValidationType = "date",
ErrorMessage = message
};
}
}
以下是我如何将属性连接到规则:
public class SampleValidator : AbstractValidator<SampleModel>
{
public SampleValidator()
{
this.RuleFor(m => m.SomeDate).Date();
}
}
如何访问验证规则&amp;具有这些值的模型的元数据?