繁体   English   中英

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

[英]In ASP.NET MVC, how to validate an integer property for an enumeration range

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

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

这是我所拥有的:

[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; }

这个 class 让您 map 将列中的基础值转换为相应的枚举常量名称。 这使您可以定义一个包含与数据库值对应的描述性值的枚举,然后在显示数据时使用枚举常量名称而不是数据库值。

[EnumDataType(typeof(ReorderLevel))]  
public object SalutationCd { get; set; }  

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM