2014-10-17 12 views
8

Ich habe ein Enum in meiner Rasiereransicht als ein verstecktes Feld dargestellt, das zu einem Aktionsergebnis zurückgeschrieben wird.Validierung von Enum-Werten innerhalb von C# MVC. Teilvalidierung erfolgt - Wie ändert man das Validierungsverhalten?

Ich habe festgestellt, dass, wenn es den String-Wert innerhalb der HTML gebunden ist, überprüft es automatisch den Wert für die Enumeration.

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

Rendered HTML:

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

Wenn ich den Wert innerhalb des DOM, um etwas falsch und senden Sie das Formular ändern, ModelState.IsValid kehrt false und der folgende Fehler ist hinzugefügt zum ModelState:

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

Das ist alles Soße, aber ich dachte, dass, wenn ich ein Ansichtsmodell erstellte, dass ich Validierungsregeln explizit auf meinem Ansichtsmodell festlegen musste, z. B. das [Required] Attribut.

Auch gibt es ein Validierungsattribut speziell dafür EnumDataType genannt.

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

Frage

Wenn die Validierung automatisch geschieht, wenn die Bindung, was der Punkt, in dem Attribut EnumDataType Datenvalidierung ist?

+1

Ein 'enum'-Wert ist immer erforderlich (er kann nicht null sein), weshalb die Validierung hinzugefügt wird. Wenn Sie nicht möchten, dass es erforderlich ist, machen Sie es NULL-'öffentlichen QuizType? QuizType {erhalten; einstellen; } ' –

+0

In der Tat, aber ich setze es nicht auf 'null', ich setze es auf einen Wert, der nicht in der Enum enthalten ist – Luke

+0

Auch 'int' ist nicht NULL-fähig, aber wenn ich es einstellen sollte null würde nur als 0 gebunden sein ..., so dass keine automatische Validierung durchgeführt wird. Wo wird dokumentiert, welche Typen nicht automatisch validiert werden? – Luke

Antwort

21

Ok, also habe ich die Antwort auf meine eigene Frage gefunden.

Die angezeigte Fehlermeldung ist eher eine generische Fehlermeldung, wenn die Bindung nicht möglich war. Wenn die Bindung Versuche, eine inexistent String-Darstellung des ENUM-Wert aus dem HTML an den ENUM geschrieben zu binden, erzeugt er den Fehler:

The value 'myincorrectvalue' is not valid for QuizType. 

Genau die gleiche Fehlermeldung erscheinen würde, wenn ich versuchen würde, um einen Zeichenfolgenwert an eine int innerhalb meiner View Model-Klasse zu binden.

Es scheint, dass das Problem ist, dass eine Enumeration, ebenso wie die Zeichenfolgendarstellung, ein beliebiger ganzzahliger Wert sein kann. Ich kann die enum auf eine beliebige Zahl setzen, auch wenn diese Nummer nicht in meiner enum existiert.

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

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

Daher ist dies gültig und wird ohne Fehler auf meinen ENUM-Wert gebunden werden, auch wenn 1000 nicht in meiner Enum existiert:

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

// Binder will bind this just fine 
QuizType = 1000 

Das ist, wo das EnumDataType Validierung Attribut kommt. wenn ich die Validierung Attribut auf meine enum innerhalb meiner Ansicht nach Modell hinzu:

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

Mit dem Attribute an Ort und Stelle, werde ich nur in der Lage sein, meine gültigen eNUM-Werte zuweisen (0 oder 1 für dieses Beispiel).

So die falschen STRING-Darstellungen aus dem HTML-Code für Sie automatisch beim Binden validiert, aber eine Überprüfung für alle Integer-Wert nicht.

Ich hoffe, dass dies ENUMS innerhalb von ASP.NET MVC Validierung validiert.

+0

Hey danke, dass du dir die Zeit genommen hast, dies aufzuschreiben. – Worthy7

+0

Ich bin wirklich froh, dass ich geholfen habe! Das verwirrte mich eine Weile. – Luke