2013-04-18 15 views
9

Jak mogę ustawić liczbę całkowitą odrzuconą przez interfejs WWW JSON.NET/MVC 4, dla której wyliczenie nie ma elementu? Np:Interfejs MVC4 WebAPI odrzuca nieprawidłowe wartości wyliczenia

Jeśli mam ten model:

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 
} 

Gdybym zakładać { Color: 9999 }, ja skończyć z modelem gdzie model.Color = 999 i chcę wrócić do Bad Request kod stanu zamiast.

Odpowiedz

18

Jedną z opcji jest, aby napisać walidator:

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; 
    } 
} 

wykorzystania jako:

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

public class Car 
{ 
    [ValidEnumValue] 
    public Color Color { get; set; } 
} 

w sterowniku, ModelState.IsValid byłoby false.
Możesz także rzucić ValidationException, jeśli naprawdę chcesz, aby nie spełnić żądania, ale nie jestem całkiem na pewno, w jaki sposób powinny być używane.

+1

Uwaga: Użyłem MVC 4 do przetestowania go, a nie Web API, ale myślę, że powinien być taki sam. – Kobi

+1

To jest wciąż świetna odpowiedź w 2017 roku z ASP.NET Core, która, tak, jest całkowicie poprawna z Web API. – Technetium

+0

Mam problem z tym, jak to może działać, ponieważ polegasz na typie danych "value", aby już być typem Enum, więc w jaki sposób ten test kiedykolwiek zawiedzie? Kiedy wypróbowałem ten kod w WebAPI2, "wartość" została wypełniona wartością domyślną, gdy śmieci zostały przekazane, więc oczywiście przechodzi test. W związku z tym wygląda na to, że WebAPI2 działa po wyjęciu z pudełka po przejściu kontroli do ModelState.IsValid. – retsvek

15

Okazuje się, że EnumDataTypeAttribute, który jest dostarczany z out-of-the-box ValidationAttributes w przestrzeni nazw System.ComponentModel.DataAnnotations, robi Enum.Defined check.

Kiedyś zastosowano ten atrybut do mojego widoku modelu out-of-zakres wartości całkowitych nie powiodła się:

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

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

Uwaga: wartości, które mogą być analizowane pod liczb, które są zdefiniowane w enum będzie nadal przechodzą sprawdzanie poprawności ze względu na domyślne zachowanie wiązania modelu enum. Oznacza to, że na przykład true zostanie przeanalizowany jako 1, który byłby ważny dla tego wyliczenia. Zakładam, że będą również działać znaki, które można odwzorować na liczby całkowite.

Jeśli chcesz tylko jeden posmak przetwarzania enum do pracy, czy to ciąg lub liczbę całkowitą, rozważ użycie tego konkretnego typu w modelu widoku, a następnie napisz niestandardowy ValidationAttribute, który przyjmuje typ wyliczeniowy, sprawdzając, czy ciąg znaków lub liczba całkowita na modelu widoku odpowiada wartości w wyliczeniu.

+0

Chociaż powyższa odpowiedź jest akceptowana jako rozwiązanie, ta odpowiedź działa dla mnie jak urok. –

Powiązane problemy