Asp.net mvc 使用asp.net mvc使特定枚举值的验证失败

Asp.net mvc 使用asp.net mvc使特定枚举值的验证失败,asp.net-mvc,asp.net-mvc-5.2,Asp.net Mvc,Asp.net Mvc 5.2,是否存在验证某个枚举值的枚举验证属性 或者我应该手动执行此操作: if(viewModel.State == State.None) base.AddModelError("","wrong enum selected..."); 您将如何做到这一点?我将创建自己的验证属性,例如(未测试): 用法: public class TestModel { [EnumValue(SomeEnum.Right)] public SomeEnum Value { get; set; } }

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

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

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

您将如何做到这一点?

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

用法:

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; }
}
枚举:

视图模型:

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

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

我的枚举验证是这样的,在dataannotation验证中起作用

public enum CreatedBySelfOrOthersEnumValues
{
    Self,
    Others
}

  
public class CampaignRegisterValidationModel
{
    [Required]
    public string Name { get; set; }

    [Required]
    public CreatedBySelfOrOthersEnumValues CreatedForSelfOrOthers { get; set; }

    [Required]
    public int CountryCode { get; set; }

    public string Phone { get; set; }
    public string Email { get; set; }
}
然后验证它

if (ModelState.IsValid)
{

}

这样做有问题吗?您正在寻找属性验证吗?我相信你可以定义你自己的属性,赋予你这种功能没有问题,我只是在这里寻找最佳实践。或者有人已经使用了该属性,或者我在最新的mvc中找不到它;-)为什么在视图中包含一个无效的枚举值(仅与用户合并)?是否将属性
[必需]设置为公共状态?状态{get;set;}
并仅在
枚举状态
中包含有效值(如果该枚举正在其他地方使用,则使用视图模型)。或者,您需要一个接受有效(或无效)名称数组的自定义验证属性,比如
[RequiredEnum(Exclude=“None”)]public State?状态{get;set;}
是否可以使此属性一般作为公共属性使用?SomeEnum EnumVal{get;private set;}似乎是硬编码的。如果我要创建一个属性,它必须正常工作,否则会浪费时间,那么我宁愿使用我的oneliner…而不是在MVC中-在反序列化模型时,它需要所有字段都是可变的。
public enum CreatedBySelfOrOthersEnumValues
{
    Self,
    Others
}

  
public class CampaignRegisterValidationModel
{
    [Required]
    public string Name { get; set; }

    [Required]
    public CreatedBySelfOrOthersEnumValues CreatedForSelfOrOthers { get; set; }

    [Required]
    public int CountryCode { get; set; }

    public string Phone { get; set; }
    public string Email { get; set; }
}
if (ModelState.IsValid)
{

}