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



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

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

我有:

[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种不同的称呼。但是,因为我已经知道这稍后会映射到enum,所以我想做这样的事情参见[EnumDataTypeAttribute Class][1]。

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

但是,这会给出一个映射错误。

我希望有一个属性,它只验证我的整型数是否在给定enum的值范围内。如何验证(整数)的enum?

[1]: https://learn.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")]

相关内容

  • 没有找到相关文章

最新更新