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.
Uwaga: Użyłem MVC 4 do przetestowania go, a nie Web API, ale myślę, że powinien być taki sam. – Kobi
To jest wciąż świetna odpowiedź w 2017 roku z ASP.NET Core, która, tak, jest całkowicie poprawna z Web API. – Technetium
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