4

在这个项目中,我们不使用System.ComponentModel.DataAnnotations命名空间中的默认数据注释属性,而是构建了自定义属性。

所以我们确实在[required]属性上放置了一个属性,但它是自定义构建的。

对于服务器端验证,我们设法使用自定义验证提供程序覆盖了验证,但我们被客户端验证困住了。

正如我在文档中所读到的,我看到当您使用默认[required]属性时,这些属性会呈现在 html 元素上:

data-val-lengthmax="10" data-val-length-min="3" data-val-required="The ClientName field is required."

我认为这是由框架完成的,它读取普通required属性,然后呈现 html 属性。

我们可以让框架也为我们呈现这些属性吗?

4

2 回答 2

4

我们可以让框架也为我们呈现这些属性吗?

是的,有两种可能:

  1. 让您的自定义属性实现IClientValidatable您将在其中实现客户端验证规则的接口。
  2. 注册一个自定义DataAnnotationsModelValidator<TAttribute>,其中 TAttribute 将是您的自定义验证属性以及您将在其中实现自定义客户端验证规则的位置(这是 Microsoft 用来为 Required 属性实现客户端验证的方法,这就是为什么如果您编写一个派生的自定义验证器属性从中您不会获得客户端验证)。然后,您需要使用DataAnnotationsModelValidatorProvider.RegisterAdaptercall 使用自定义属性注册您的自定义模型验证器。
于 2012-10-19T06:32:34.460 回答
2

为了在自定义属性中启用客户端验证,您可以在属性中实现IClientValidatable接口:

public class requiredAttribute : ValidationAttribute, IClientValidatable
{
    ...

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        return new[] { new ModelClientValidationRule { ErrorMessage = "<Your error message>", ValidationType = "required" } };
    }
}

作为替代方案,您可以为您的属性实现验证适配器:

public class requiredAttributeAdapter : DataAnnotationsModelValidator<requiredAttribute>
{
    public requiredAttributeAdapter(ModelMetadata metadata, ControllerContext context, RequiredAttribute attribute)
        : base(metadata, context, attribute)
    { }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        return new[] { new ModelClientValidationRule { ErrorMessage = "<Your error message>", ValidationType = "required" } };
    }
}

并将其注册到 Global.asax 中的数据注释验证引擎中:

protected void Application_Start()
{
    ...
    DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(requiredAttribute), typeof(requiredAttributeAdapter));
}

当然,您需要确保您在上述类中引用了您的属性。

于 2012-10-19T06:39:25.637 回答