2012-03-30 5 views
6

Ich habe eine Modellklasse "Country" mit der Eigenschaft "CultureId", die NICHT wie erforderlich markiert ist. Eine andere Klasse "CountryViewModel" enthält dieselbe Eigenschaft "CultureId".ASP.NET MVC fügt Validierung für nicht erforderliche Felder hinzu

Beim Rendern der "Create" -Ansicht bemerkte ich, dass die Validierungsdatenattribute dem Textfeld "CultureId" hinzugefügt wurden, obwohl keine Datenanmerkungen hinzugefügt wurden.

Ich bin mit

@Html.HiddenFor(mode => mode.CultureId) 

Was ist die Ursache für ein solches Verhalten sein könnte?

Dank

Antwort

0

, wenn Sie Daten Annotationen verwenden können, Sie

namespace MvcApplication1.Models 
{ 
[MetadataType(typeof(MovieMetaData))] 
public partial class Movie 
{ 
} 


public class MovieMetaData 
{ 
    [Required] 
    public object Title { get; set; } 

    [Required] 
    [StringLength(5)] 
    public object Director { get; set; } 


    [DisplayName("Date Released")] 
    [Required] 
    public object DateReleased { get; set; } 
} 

}

diese http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.metadatatypeattribute.aspx

sollten überprüfen, hilft es Ihnen, Validierungen ohne Modelle auf Datenbank-Seite eingestellt.

+0

Sein Problem besteht nicht darin, wie für eine Eigenschaft erforderlich festgelegt, sondern wie die unerwünschte HTML-Validierung, die er läuft zu vermeiden. Darüber hinaus ist Ihre Art der Verwaltung von Attributen typisch für dynamische Daten, nicht die Art, wie MVC normalerweise funktioniert. – themarcuz

+0

Ich dachte, es wird Überschreibungsregeln überschreiben, wenn die Metadatenklasse leer sein wird. –

12

Ich schätze deine CultureId ist ein Int. MVC fügt erforderliche Variablen automatisch zu nicht nullbaren Werttypen hinzu.

Um dies zu deaktivieren hinzufügen

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false; 

zu Application_Start oder machen Sie Ihren int NULL festlegbare

+0

Bereits hinzugefügt und immer noch das gleiche Verhalten. Ich werde versuchen, das int Null zu machen. Danke – Bill

+1

Gute Antwort. Es funktioniert, um die 'data-required' Validierung zu vermeiden, aber dann, da die Id ein' int' ist, fügt sie die 'data-val-number' hinzu, die die Formularübergabe beim Erstellen verhindert. Ich könnte es umgehen, indem ich Standardwerte wie 0 setze, aber ich sollte nicht müssen. – eudaimos

+0

Mein Fehler - es funktioniert, da die Validierung scheint, Daten-Val-Nummer für versteckte Eingaben zu überspringen – eudaimos

0

try this:

ModelState["CultureId"].Errors.Clear(); 

if (ModelState.IsValid)  
    { 
     ..... 
    } 

Wenn CultureId int ist, dann wird es das gewünschte Ergebnis erhalten Sie auch ...

+1

Dies ist ein bisschen wie ein Klud, der das eigentliche Problem vermeidet, das hier involviert ist. Siehe [Antwort von dskh für mehr] (http://stackoverflow.com/a/9941032/237838). –

8

Es gibt mehrere Möglichkeiten zur Handl e dies -
a). Machen Sie die Eigenschaft als Nullable wie

b). Verwenden Sie die folgende Controller-Klasse:

ModelState["Age"].Errors.Clear(); 

c). Zum Startup hinzufügen DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;

Verwandte Themen