La validation côté serveur d'une propriété de chaîne REQUIRED dans MVC2 Entity Framework 4 ne fonctionne pas.

asp.net-mvc data-annotations entity-framework

Question

J'essaie d'obtenir la validation côté serveur d'une propriété String Entity Framework pour fonctionner. D'autres validations côté serveur, telles que la validation du type de données et les propriétés dateTime et numériques EF requises, fonctionnent.

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

La propriété String avec laquelle je rencontre des problèmes est mappée sur une colonne SQL 2008, Varchar (50) non nullable.

Lorsque j'essaie de publier dans mon action Create avec une chaîne vide pour cette propriété, l'erreur suivante est générée.

Détails des exceptions: System.Data.ConstraintException: cette propriété ne peut pas être définie sur une valeur null.

Lorsque je poste dans l'action avec un espace, je reçois avec succès le message de validation requis.

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

Voici le code d'origine généré automatiquement à partir du cadre 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 Action (CREATE ou EDIT), l'exception peut se produire avant d'entrer dans la méthode ou au sein de la méthode lorsque UpdateModel () est appelé. L'exception interne se trouve à la ligne ci-dessous du fichier model.designer.cs.

_GradeTypeName = StructuralObject.SetValidValue(value, false);

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

Réponse acceptée

J'avais le même problème pendant un moment. J'ai trouvé une partie de l'explication ici: http://mvcmusicstore.codeplex.com/workitem/6604 . En résumé, l'exception " System.Data.ConstraintException: cette propriété ne peut pas être définie sur une valeur null " est générée par la validation de propriété de l'entité. Cette validation est effectuée lorsque votre application mvc essaie de lier le champ de formulaire à la propriété d'entité correspondante (elle s'appelle PreBinding Validation et se produit lors de la soumission du formulaire). Comme le champ est vide (donc converti en null), le classeur tente de lier une valeur null à la propriété, ce qui enfreint la contrainte Non-Null de la propriété de votre entité.

Mais si vous postez avec un champ vide (différent de vide, donc de null), la validation de l’entité passe (car la propriété n’est plus définie sur une valeur nulle), puis vous voyez le message de la validation d’annotation "Required", est effectuée après la pré-liaison (c'est la validation PostBinding ).

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

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

J'espère que cela t'aides!


Réponse populaire

C'était très utile. J'utilise MVC3 et le framework entity. Je passais mes entités directement dans le contrôleur, mais j'ai obtenu la même erreur lorsque le formulaire était vide. Avec la structure d'entité, vous pouvez valider les données en modifiant le code généré automatiquement, mais créer une classe partielle distincte de l'entité me convenait mieux.

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

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


Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow