2014-10-17 13 views
8

Ho rappresentato un enum all'interno della mia vista del rasoio come un campo nascosto, che viene posticipato a un risultato di azione.Validazione dei valori di enum in C# MVC. Convalida parziale - Come modificare il comportamento di convalida?

Ho notato che quando si lega il valore della stringa fornito all'interno del codice HTML, che convalida automaticamente il valore per l'enumerazione.

/// <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) 

rendering HTML:

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

Se cambio il valore all'interno del DOM per qualcosa di sbagliato e inviare il modulo, ModelState.IsValid rendimenti false e il seguente errore viene aggiunto alla ModelState:

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

Questo è tutto sugo, ma ho pensato che se ho creato un modello di vista, che ho dovuto impostare in modo esplicito le regole di convalida sul mio modello di vista, ad esempio l'attributo [Required].

Inoltre v'è un attributo di convalida appositamente per questo chiamato EnumDataType.

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

Domanda

Se la convalida avviene automaticamente quando vincolante, qual è il punto in l'attributo di convalida dei dati EnumDataType?

+1

Un valore 'enum' è sempre richiesto (non può essere null) in modo che venga aggiunta la convalida. Se non vuoi che sia richiesto, rendilo nullable 'public QuizType? QuizType {get; impostato; } ' –

+0

Infatti, ma non lo sto impostando su' null', lo sto impostando su un valore che non è contenuto nell'Enum – Luke

+0

Inoltre, 'int' non è annullabile, ma se dovessi impostarlo null sarebbe semplicemente associato a 0 ... in modo che non esegua la convalida automatica. Dove è documentato quale tipo di do/do-do non viene auto validato? – Luke

risposta

21

Ok, quindi ho trovato la risposta alla mia domanda.

Il messaggio di errore che è apparso è più di un messaggio di errore generico per quando il bind non era possibile. Quando il tentativo di associare un inesistente rappresentazione stringa del valore enum inviato dal HTML al enum vincolante, produce l'errore:

The value 'myincorrectvalue' is not valid for QuizType. 

Il messaggio di errore esattamente lo stesso sembrerebbe se dovessi tentare per associare un valore stringa a un int all'interno della classe View Model.

Sembra che il problema è che, nonche la rappresentazione di stringa, un enum può essere qualsiasi valore intero. Posso impostare l'enum su qualsiasi numero, anche se quel numero non esiste nel mio enum.

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

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

Pertanto, questo è valido e sarà vincolato senza errori al mio valore enum, anche se 1000 non esiste nel mio enum:

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

// Binder will bind this just fine 
QuizType = 1000 

Ecco dove l'attributo EnumDataType convalida entra. Se posso aggiungere l'attributo di convalida al mio enum nel mio vista del modello:

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

con l'attributo al suo posto, sarò solo in grado di assegnare i miei valori enum validi (0 o 1 per questo esempio).

Quindi le rappresentazioni STRING errate pubblicate dall'HTML vengono convalidate automaticamente al momento dell'associazione, ma non viene verificato alcun valore intero.

Spero che questo chiarisca la convalida di ENUMS in ASP.NET MVC.

+0

Hey, grazie per aver dedicato del tempo per scrivere questo. – Worthy7

+0

Sono davvero felice di aver aiutato! Questo mi ha lasciato perplesso per un po '. – Luke

Problemi correlati