【问题标题】:Override Existing Data Annotation Attribute in asp.net core 1.1在 asp.net core 1.1 中覆盖现有的数据注释属性
【发布时间】:2017-05-08 19:06:37
【问题描述】:

我正在尝试覆盖 .net 核心中的 RequiredAttribute,但似乎不适用于 asp.net 核心 1.1

这是测试代码

public class CustomRequiredAttribute : RequiredAttribute
{
    public CustomRequiredAttribute():base()
    {

    }

    public override string FormatErrorMessage(string name)
    {
        return base.FormatErrorMessage(name);
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        return base.IsValid(value, validationContext);
    }

}

在我的模型上使用后,我期待像 field is required 这样的正常结果,因为我还没有自定义它,只是调用基本方法。

这似乎没有按预期工作,只是绕过了客户端和服务器端的要求。

这样做的目的是将从数据库中提取的验证消息添加到ErrorMessage 属性。

【问题讨论】:

  • 你没有覆盖它,你正在创建一个派生类。你能展示一下你是如何使用它的吗?
  • 我正在派生,一旦它工作将覆盖某些方法,我将它用作模型上的标准,即 [CustomRequired] public string Name{get;set;} 我希望它会调用isvalid 但断点从未命中。
  • 看看这个 SO 是否有帮助:stackoverflow.com/questions/12573362/…
  • 不像我使用 .net 核心,而且似乎 DataAnnotationsModelValidatorProvider 在任何库中都不存在。
  • 当你查看你的html时,你看到data-val-required属性了吗?

标签: c# asp.net-core .net-core asp.net-core-1.1


【解决方案1】:

您的问题是ValidationAttributeAdapterProvider,它是IValidationAttributeAdapterProvider 的默认实现,仅检查特定类型。因此,使用自定义实现会导致缺少“适配器提供者”,从而导致缺少数据属性。

解决方案:提供您自己的IValidationAttributeAdapterProvider 实现,对于非自定义的东西可以转发到默认实现...

public class CustomValidationAttributeAdapterProvider : IValidationAttributeAdapterProvider
{
    private IValidationAttributeAdapterProvider innerProvider = new ValidationAttributeAdapterProvider();

    public IAttributeAdapter GetAttributeAdapter(ValidationAttribute attribute, IStringLocalizer stringLocalizer)
    {
        if (attribute == null)
            throw new ArgumentNullException(nameof(attribute));

        var type = attribute.GetType();

        if (type == typeof(CustomRequiredAttribute))
            return new RequiredAttributeAdapter((RequiredAttribute)attribute, stringLocalizer);

        return innerProvider.GetAttributeAdapter(attribute, stringLocalizer);
    }
}

...并将其注册为单例。

services.AddSingleton<IValidationAttributeAdapterProvider, CustomValidationAttributeAdapterProvider>();

【讨论】:

  • 我已经厌倦了类似的东西,我相信这是正确的方向。
  • @AliK 它确实有效。还是我错过了一些重要的步骤?
  • 我遵循了类似的模式,但是是的,这也应该有效。问题出在这一点上,因为您知道框架在不断变化,所以现在让我们看看 MS 的新版本会发生什么。
猜你喜欢
  • 2022-11-02
  • 1970-01-01
  • 2011-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多