Asp.net mvc 4 MVC4 WebAPI拒绝无效的枚举值

Asp.net mvc 4 MVC4 WebAPI拒绝无效的枚举值,asp.net-mvc-4,asp.net-web-api,Asp.net Mvc 4,Asp.net Web Api,如何使JSON.NET/MVC 4 WebAPI拒绝枚举没有成员的整数值?例如: 如果我有这个模型: public enum Colour { Red = 1 }; public class Model { public Colour Colour { get; set; } } Model Post(Model model) { // model.Colour could be 99, 34234234, 0 etc, etc } 如果我发布{Color:9999},我会得到一

如何使JSON.NET/MVC 4 WebAPI拒绝枚举没有成员的整数值?例如:

如果我有这个模型:

public enum Colour { Red = 1 };

public class Model
{
  public Colour Colour { get; set; }
}

Model Post(Model model)
{
   // model.Colour could be 99, 34234234, 0 etc, etc
}

如果我发布
{Color:9999}
,我会得到一个model.Color=999的模型,我想返回一个错误的请求状态代码。

一个选项是编写验证程序:

public class ValidEnumValueAttribute : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        Type enumType = value.GetType();
        bool valid = Enum.IsDefined(enumType, value);
        if (!valid)
        {
            return new ValidationResult(String.Format("{0} is not a valid value for type {1}", value, enumType.Name));
        }
        return ValidationResult.Success;
    }
}
用作:

public enum Color {Red = 1, Blue = 2}

public class Car
{
    [ValidEnumValue]
    public Color Color { get; set; }
}
在控制器中,
ModelState.IsValid
将是
false

如果您真的想让请求失败,也可以抛出一个
ValidationException
,但我不太确定它们应该如何使用。

结果是,
系统.ComponentModel.DataAnnotations
命名空间中的现成的ValidationAttributes附带了一个

将此属性应用于视图模型后,超出范围的整数值验证失败:

public enum Color {Red = 1, Blue = 2}

public class Car
{
    [EnumDataType(typeof(Color))]
    public Color Color { get; set; }
}
注意:由于枚举模型绑定的默认行为,可以解析为枚举上定义的整数的值仍将通过验证。这意味着,例如,
true
将被解析为
1
,这对该枚举有效。我假设可以映射到整数的字符也可以工作


如果你只想要一个枚举的EnUM解析工作,那就是字符串或整数,考虑在视图模型上使用那个特定类型,然后编写一个自定义的<代码>验证属性> /CODE,它引用枚举类型,验证视图模型中的字符串或整数与枚举中的值匹配。

注释:我使用MVC 4来测试它,不是Web API,但我认为应该是一样的。这仍然是2017年ASP.NET Core的一个很好的答案,是的,它在Web API中是完全有效的。我正在努力解决这个问题,因为您依赖的数据类型“value”已经是枚举类型,那么这个测试怎么会失败呢?当我在WebAPI2中尝试这段代码时,传入垃圾时,“value”被填充为默认值,因此它当然通过了测试。话虽如此,当您利用对ModelState.IsValid的检查时,WebAPI2似乎是开箱即用的。不过,我现在面临的问题是:(a)我无法控制该失败的消息;(B)在处未提供枚举值且[Required]属性似乎无法解决时,使用不起作用(因为使用默认值时存在同样的问题)@retsvek-这些问题都很好。我建议你发布一个(或两个)新问题,这样你会得到更好的答案。(这个答案已经有将近4年的历史了!)虽然上面的答案被接受为解决方案,但这个答案对我来说很有吸引力。在WebApi中不适用于我-这可能只适用于MVC控制器吗?@mcintyre321只要运行其他验证属性,它就应该有效。就MVC与WebApi而言,这个属性没有什么特别之处。我很高兴我滚动了为了找到这个答案,我几乎在不需要自定义代码的情况下编写了自定义代码(嗯,复制并粘贴了…)!