访问所有验证规则&模型绑定器中模型的验证元数据

时间:2012-10-11 21:02:41

标签: c# asp.net-mvc asp.net-mvc-3 data-annotations fluentvalidation

我正在尝试构建一个继承自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;具有这些值的模型的元数据?

0 个答案:

没有答案