2013-04-18 5 views
9

JSON.NET/MVC 4 WebAPIで列挙型のメンバがない整数値を拒否するにはどうすればよいですか?私はこのモデルがある場合MVC4 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モデルで終わると私の代わりに不正な要求のステータスコードを返すようにしたいです。

答えて

18

一つの選択肢は、バリデータを作成することです:として

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.IsValidfalseだろう。
本当にリクエストを失敗させたい場合は、ValidationExceptionを投げることもできますが、私はではありません。それらはどのように使うべきかを確かめてください。

+1

注:Web APIではなく、MVC 4を使用してテストしましたが、同じである必要があります。 – Kobi

+1

これは2017年のASP.NET Coreの素晴らしい答えです。はい、Web APIで完全に有効です。 – Technetium

+0

"value"のデータ型に既にEnum型に頼っているので、このテストがどのように失敗するのでしょうか? WebAPI2でこのコードを試したところ、ゴミが渡されたときに "value"にデフォルト値が設定されたので、もちろんテストに合格しました。これで、ModelState.IsValidのチェックを活用すると、WebAPI2がすぐに使えるように思えます。 – retsvek

15

は、System.ComponentModel.DataAnnotations名前空間の既定のValidationAttributesに付属しており、Enum.Defined checkです。私は私の見解モデルにこの属性を適用すると

は、範囲外の整数値は、検証に失敗しました:

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

public class Car 
{ 
    [EnumDataType(typeof(Color))] 
    public Color Color { get; set; } 
} 

注:意志まだ列挙型で定義された整数に解析することが可能な値をenumモデルバインディングのデフォルトの動作のために検証をパスします。つまり、trueは、この列挙体で有効な1として解析されます。整数にマップできる文字も使えると仮定しています。

列挙型解析のフレーバを1つだけ使用する場合は、文字列または整数型にする必要があります。ビューモデルでその特定の型を使用することを検討し、列挙型を受け入れるカスタムValidationAttributeを記述します。ビューモデルの整数は列挙型の値と一致します。

+0

上記の答えは解決策として受け入れられますが、この回答は私の魅力のように機能します。 –

関連する問題