2014-10-17 17 views
8

Reprezentuję enum w moim widoku brzytwy jako ukryte pole, które jest odsyłane z powrotem do wyniku akcji.Sprawdzanie poprawności wartości wyliczeniowych w C# MVC. Występuje częściowa weryfikacja - Jak zmienić zachowanie sprawdzania poprawności?

Zauważyłem, że gdy wiąże wartość ciągu podanego w kodzie HTML, automatycznie sprawdza poprawność wartości wyliczenia.

/// <summary> 
/// Quiz Types Enum 
/// </summary> 
public enum QuizType 
{ 
    /// <summary> 
    /// Scored Quiz 
    /// </summary> 
    Scored = 0, 

    /// <summary> 
    /// Personality Type Quiz 
    /// </summary> 
    Personality = 1 
} 

Razor:

@Html.HiddenFor(x => x.QuizType) 

wytopione HTML:

<input data-val="true" data-val-required="Quiz Type is not valid" id="QuizType" name="QuizType" type="hidden" value="Scored"> 

Gdybym zmienić wartość w DOM coś niewłaściwego i wysłać formularz, ModelState.IsValid powraca false i następujący błąd jest dodano do ModelState:

"The value 'myincorrectvalue' is not valid for QuizType." 

To wszystko sos, ale pomyślałem, że jeśli stworzyłem model widoku, musiałem jawnie ustawić zasady sprawdzania poprawności w moim modelu widoku, takie jak atrybut [Required].

Istnieje również atrybut sprawdzania poprawności specjalnie dla tego o nazwie EnumDataType.

[EnumDataType(typeof(QuizType))] 
public QuizType QuizType { get; set; } 

Pytanie

Jeśli walidacja odbywa się automatycznie podczas wiązania, jaki jest sens w atrybucie walidacji EnumDataType danych?

+1

Wartość 'wyliczenia 'jest zawsze wymagana (nie może mieć wartości NULL), dlatego dodano poprawność sprawdzania poprawności. Jeśli nie chcesz, aby było to wymagane, uczyń to nullable 'public QuizType? QuizType {get; zestaw; } ' –

+0

Rzeczywiście, ale nie ustawiam go na' null', ustawiam go na wartość, która nie jest zawarta w Enum – Luke

+0

Również, 'int' jest nie-nullable, ale gdybym miał go ustawić null byłby on po prostu związany jako 0 ... tak, aby nie wykonywał automatycznej weryfikacji. Gdzie jest udokumentowane, które typy nie są automatycznie sprawdzane? – Luke

Odpowiedz

21

Ok, więc znalazłem odpowiedź na moje własne pytanie.

Komunikat o błędzie, który się pojawił, jest bardziej ogólnym komunikatem o błędzie, gdy wiązanie nie było możliwe. Gdy wiązanie prób wiążą nieistniejącego znaków reprezentujący wartość enum pisał z HTML do wyliczenia, to daje błąd:

The value 'myincorrectvalue' is not valid for QuizType. 

Dokładna sam komunikat o błędzie wydaje gdybym próbować aby powiązać wartość ciągu z int w mojej klasie widoku modelu.

Wydaje się, że problem polega na tym, że oprócz wyliczenia ciągów, wyliczenie może być dowolną wartością całkowitą. Mogę ustawić wyliczenie na dowolną liczbę, nawet jeśli ta liczba nie istnieje w moim wyliczeniu.

/// <summary> 
/// Quiz Types Enum 
/// </summary> 
public enum QuizType 
{ 
    /// <summary> 
    /// Scored Quiz 
    /// </summary> 
    Scored = 0, 

    /// <summary> 
    /// Personality Type Quiz 
    /// </summary> 
    Personality = 1 
} 

Dlatego ta jest ważna i będzie związany bezbłędnie do mojego wartość enum, choć 1000 nie istnieje w moim enum:

<input data-val="true" id="QuizType" name="QuizType" type="hidden" value="1000"> 

// Binder will bind this just fine 
QuizType = 1000 

To gdzie atrybut EnumDataType walidacja przychodzi. Jeśli dodać atrybut poprawności mojego wyliczenia w moim modelu widoku:

[EnumDataType(typeof(QuizType), ErrorMessage = "Quiz type value doesn't exist within enum")] 
public QuizType QuizType { get; set;} 

z atrybutem w miejscu, będę tylko w stanie przypisać moje prawidłowych wartości enum (0 lub 1 dla tego przykładu).

W związku z tym niepoprawne odwzorowania STRING przesłane z kodu HTML są sprawdzane automatycznie w momencie wiązania, ale sprawdzenie wartości dowolnej nie spowoduje.

Mam nadzieję, że to wyczyści się sprawdzania poprawności ENUMS w ASP.NET MVC.

+0

Hej dzięki za poświęcenie czasu, aby to napisać. – Worthy7

+0

Naprawdę cieszę się, że pomogłem! To mnie zastanawiało przez chwilę. – Luke

Powiązane problemy