微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 ASP.NET MVC 中,如何验证枚举范围的整数属性

如何解决在 ASP.NET MVC 中,如何验证枚举范围的整数属性

我正在 MVC 中创建一个 Web API。在我的 viewmodel-Objects 中,我想为整数输入创建验证,稍后在映射到一些枚举的过程中。

注意:由于项目范围之外的限制,我无法将视图模型的类型更改为实际的枚举。

这是我所拥有的:

[ClientValidation]
public class ContactDataObject {
    [Range(1,3)] //fixed range,bad
    public int? SalutationCd { get; set; }
}

我也可以

    [Range(/*min*/(int)Salutation.Mr,/*max*/(int)Salutation.LadiesAndGentlemen)]

这很好用,我们现在有 3 种称呼的变体。但是,由于我已经知道这稍后会映射到枚举,因此我想做这样的事情,请参阅 [EnumDataTypeAttribute Class][1]。

[ClientValidation]
public class ContactDataObject {
    [EnumDataType(typeof(Salutation))] //gives mapping error
    public int? SalutationCd { get; set; }
}

然而,这会导致映射错误

我想要一个属性,它仅验证我的整数是否在给定枚举的值内。 如何验证枚举的(整数)

[1]: https://docs.microsoft.com/en-us/dotnet/api/system.componentmodel.dataannotations.enumdatatypeattribute?view=net-5.0):

解决方法

您可以尝试使用自定义验证:

public class EnumValueValidationAttribute : ValidationAttribute {
    private readonly Type _enumType;

    public EnumValueValidationAttribute(Type type) {
        _enumType = type;
    }

    public override bool IsValid(object value) {
        return value != null && Enum.IsDefined(_enumType,value); //null is not considered valid
    }
}

然后像这样使用它:

    [EnumValueValidation(typeof(Salutation))]
    public int? SalutationCd { get; set; }
,

此类允许您将列中的基础值映射到相应的枚举常量名称。这使您可以定义包含与数据库值对应的描述性值的枚举,然后在显示数据时使用枚举常量名称而不是数据库值。

[EnumDataType(typeof(ReorderLevel))]  
public object SalutationCd { get; set; }  
,
public class EnumValidation : ValidationAttribute
{
    private readonly Type type;

    public EnumValidation(Type type)
    {
        this.type = type;
    }

    protected override ValidationResult IsValid(object value,ValidationContext validationContext)
    {
        string message = FormatErrorMessage(validationContext.DisplayName);

        if (value == null)
            return ValidationResult.Success;

        try
        {
            if (!Enum.IsDefined(type,(int)value))
                return new ValidationResult(message);
        }
        catch (Exception ex)
        {
            return new ValidationResult(message);
        }

        return ValidationResult.Success;
    }
}

[EnumValidation(type:typeof(MemberTypeEnum),ErrorMessageResourceType = typeof(Message),ErrorMessageResourceName = "ERR_Invalid")]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。