我正在尝试构建一个自定义模型绑定器,继承自DefaultModelBinder
. 在这个实现中,我想访问验证规则元数据(来自 FluentValidation),因为它们包含我需要覆盖ModelState
错误消息的信息。
请注意,该链接中的答案对我没有帮助,因为我没有使用资源来验证消息。消息存储在 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
总是返回 true 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();
}
}
如何使用这些值访问我的模型的验证规则和元数据?