使用asp.net mvc对某个枚举值进行验证失败

时间:2015-03-26 16:08:24

标签: asp.net-mvc asp.net-mvc-5.2

是否存在验证某个枚举值的枚举验证属性?

或者我应该手动执行此操作:

if(viewModel.State == State.None) base.AddModelError("","wrong enum selected...");

你会怎么做?

2 个答案:

答案 0 :(得分:2)

我会创建自己的验证属性,例如(未经测试):

public enum SomeEnum
{
    Right,
    Wrong
}


[AttributeUsage(AttributeTargets.Property)]
public sealed class EnumValueAttribute : ValidationAttribute
{
    private const string DefaultErrorMessage = "Cannot be that value";

    public SomeEnum EnumVal { get; private set; }

    public EnumValueAttribute(SomeEnum enumVal)
        : base(DefaultErrorMessage)
    {
        EnumVal = enumVal;
    }

    public override string FormatErrorMessage(string name)
    {
        return string.Format(ErrorMessageString, name, EnumVal);
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var enumVal = (SomeEnum) Enum.Parse(typeof (SomeEnum), value.ToString());
        if (enumVal != EnumVal)
        {
            return new ValidationResult(DefaultErrorMessage);
        }

        return ValidationResult.Success;
    }
}

用法:

public class TestModel
{
    [EnumValue(SomeEnum.Right)]
    public SomeEnum Value { get; set; }
}

<强>已更新

所以这是通用的,你可以合理地接受它,我没有测试过这段代码,但它确实编译了。请注意,我已为枚举分配了数字值。

public enum SomeEnum
{
    Right = 1,
    Wrong = 2,
    Other = 3
}


[AttributeUsage(AttributeTargets.Property)]
public sealed class DisallowEnumValueAttribute : ValidationAttribute
{
    public object DissallowedEnum { get; private set; }
    public Type EnumType { get; private set; }

    public DisallowEnumValueAttribute(Type enumType, object dissallowedEnum)
    {
        if (!enumType.IsEnum)
            throw new ArgumentException("Type must be an enum", "enumType");

        DissallowedEnum = dissallowedEnum;
        EnumType = enumType;
    }


    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var disallowed = Convert.ChangeType(DissallowedEnum, EnumType);
        var enumVal = Convert.ChangeType(value, EnumType);

        if (disallowed == null || enumVal == null)
            throw new Exception("Something is wrong"); //or return validation result

        if (enumVal == disallowed)
        {
            return new ValidationResult("This value is not allowed");
        }

        return ValidationResult.Success;
    }
}

public class TestModel
{
    [DisallowEnumValue(typeof(SomeEnum), SomeEnum.Wrong)]
    public SomeEnum Thing { get; set; }
}

答案 1 :(得分:2)

枚举:

public enum SomeEnum
{
    Right = 1,
    Wrong = 2,
    Other = 3
}

视图模型:

public class TestModel
{
    [Range((int)(SomeEnum.Right), (int)(SomeEnum.Right), ErrorMessage = "Please select an Enum value")]
    public SomeEnum Value { get; set; }
}

无需其他代码。枚举基本上是整数,因此您可以使用Range属性来验证它们。

相关问题