2010-06-27 5 views
14

J'essaie d'obtenir la validation côté serveur d'une Entity Framework String Property pour qu'elle fonctionne. D'autres validations côté serveur, telles que la validation de type de données et les propriétés de date et d'heure numériques requises, fonctionnent.La validation côté serveur d'une propriété String OBLIGATOIRE dans MVC2 Entity Framework 4 ne fonctionne pas

Ceci dans VS 2010, .Net 4.0, Cloud MVC2 +, Entité Framework ADO.Net.

La propriété de chaîne avec laquelle je rencontre des problèmes est mappée à une colonne SQL 2008, Varchar (50) non-nullable.

Lorsque j'essaie de publier sur mon action Créer avec une chaîne vide pour cette propriété, j'obtiens l'erreur suivante.

Détails d'exception: System.Data.ConstraintException: Cette propriété ne peut pas être définie sur une valeur nulle.

Lorsque je poste sur l'action avec un espace vide, j'obtiens avec succès un message de validation de champ obligatoire.

J'ai essayé d'utiliser Data Annotations et ClientSideValidation, mais il semble y avoir des problèmes avec ClientSideValidation travaillant sur les vues partielles et les boîtes de dialogue jquery.

Voici le code autogénéré original provenant de l'infrastructure de l'entité.

[EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)] 
[DataMemberAttribute()] 
public global::System.String GradeTypeName 
{ 
    get 
    { 
     return GradeTypeName; 
    } 
    set 
    { 
     OnGradeTypeNameChanging(value); 
     ReportPropertyChanging("GradeTypeName"); 
     _GradeTypeName = StructuralObject.SetValidValue(value, false); 
     ReportPropertyChanged("GradeTypeName"); 
     OnGradeTypeNameChanged(); 
    } 
} 

En fonction de la signature de la méthode d'action (créer ou modifier), l'exception peut se produire avant d'entrer dans la méthode ou dans la méthode lorsque UpdateModel() est appelée. L'exception interne est à la ligne ci-dessous du fichier model.designer.cs.

_GradeTypeName = StructuralObject.SetValidValue(value, false); 

J'ai été capable de reproduire ceci sur une simple application web mvc2.

Répondre

28

J'ai eu le même problème pendant un certain temps. J'ai trouvé une explication ici: http://mvcmusicstore.codeplex.com/workitem/6604. Pour le dire en un mot, l'exception "System.Data.ConstraintException: Cette propriété ne peut pas être définie à une valeur nulle" est levée par la validation de propriété de l'entité. Cette validation est effectuée lorsque votre application mvc tente de lier le champ de formulaire à la propriété d'entité correspondante (elle s'appelle PreBinding Validation et se produit lors de l'envoi du formulaire). Comme le champ est vide (donc converti en null), le classeur tente de lier une valeur nulle à la propriété, ce qui viole la contrainte Non-Null sur la propriété de votre entité.

Mais si vous postez avec un champ vide (différent de vide, donc nul) validation de l'entité passe (car la propriété n'est plus définie à une valeur nulle), puis votre message à partir de la "Obligatoire" validation d'annotation, qui est effectuée après la pré-reliure (c'est PostBinding Validation).

Une solution de contournement consiste à utiliser l'annotation [DisplayFormat (ConvertEmptyStringToNull = false)] qui indique au classeur de ne pas convertir une chaîne vide en null.

[Required] 
    [DisplayFormat(ConvertEmptyStringToNull = false)] 
    public string YourStringProperty { get; set;} 

Espérons que cela aide!

+0

Merci! Cela a été un problème pour moi jusqu'à ce que j'ai trouvé votre message. – jrob

+0

Non, problemo! Je suis content que cela ait aidé! – tinesoft

+0

+1 pour une très bonne réponse (lien, conseils distillés) –

4

C'était très utile. J'utilise MVC3 et le framework d'entité.Je passais mes entités directement dans le contrôleur, mais j'ai eu la même erreur lorsque le formulaire était vide. Avec le framework d'entité, vous pouvez effectuer la validation des données en éditant le code généré automatiquement, mais créer une classe partielle séparée de l'entité a mieux fonctionné pour moi.

[MetadataType(typeof(TestEntityValidation))] 
public partial class TestEntity{ 
} 

public class TestEntityValidation{ 
    [Required] 
    [DisplayFormat(ConvertEmptyStringToNull = false)] 
    public String name { get;set} 
} 
2

Parfois, dans la base de données première approche dans EF, pouvez mettre à jour votre colonne de not null à peut être null en utilisant requête SQL et utiliser « Mise à jour du modèle dans la base de données ... » (en EDMX clic droit) alors peut-être propriété de cette entité n'est pas mise à jour correctement et donc si vous avez des données null dans cette colonne, dans le mappage, la violation se produit et cette erreur s'affiche.

Pour résoudre ce problème; Vous pouvez vérifier le Nullable dans les propriétés de la propriété de l'entité que vous avez mis à jour.