Question

VS 2010 Bêta 2, .NET 4.

Dans mon application ASP.NET MVC 2, lorsque je soumets un formulaire à une méthode d'action qui accepte un objet créé par le framework d'entité, j'obtiens l'erreur suivante :

Exception Details: System.Data.ConstraintException: This property cannot be set to a  
null value.

Source Error: 


Line 4500:                OnTextChanging(value);
Line 4501:                ReportPropertyChanging("Text");
Line 4502:                _Text = StructuralObject.SetValidValue(value, false);
Line 4503:                ReportPropertyChanged("Text");
Line 4504:                OnTextChanged();

La propriété s'appelle « Texte » et est de type « texte NOT NULL » dans MS SQL 2008.

Mon action vérifiera si la valeur est nulle ou vide, si c'est le cas, une erreur de modèle sera ajoutée, mais j'obtiens l'erreur dès que je soumets le formulaire.

Était-ce utile?

La solution

Êtes-vous liez directement à l'entité? Bien sûr semble comme ça. Donc, vous avez deux choix:

  1. Ecrire un liant modèle personnalisé qui se traduit par null -.> String vide
  2. Bind à un modèle d'édition qui permet à la place nulls, puis changer cette chaîne vide lorsque vous copiez les valeurs de l'entité dans l'action.

Je choisirais # 2, personnellement. Je pense que vous devriez toujours utiliser des modèles vue / modifier, ce qui est un excellent exemple de pourquoi.

Autres conseils

Je faisais le même problème. Je regardais autour et a trouvé un travail ici. Il décrit le problème causé par la validation EF a lieu avant la validation sur le terrain requis. Il montre également comment nous pouvons contourner ce problème en utilisant un [DisplayFormat] Tag. Espérons que cela vous aidera.

Voici le lien à la question et la solution de contournement:

serveur validation -side d'une chaîne REQUISE propriété dans MVC2 Entity Framework 4 ne fonctionne pas

Est-ce un problème avec MVC2 et Entity Framework 4 ou est-ce intentionnel ?Il semble que la validation des propriétés EF fonctionne correctement pour les champs datetime non nullables (obligatoires) et que la validation du type de données des champs numériques par rapport aux champs de chaîne fonctionne sans avoir à utiliser ViewModels.

J'ai recréé le problème en utilisant une simple table FOOBAR en utilisant une seule colonne varchar(50) non nullable appelée barName dans slq 2008.J'ai généré le modèle EF à partir de cette base de données et j'ai rapidement ajouté un contrôleur et une vue CREATE pour l'entité FOOBAR.Si j'essaie de POST sur l'action CREATE sans entrer de valeur pour la propriété barName, VS entre dans une exception dans le fichier designer.cs du modèle (tout comme celui ci-dessus).Lorsque j'essaie de contourner l'exception, le message de validation apparaît sur le formulaire et le champ est surligné en rose.

Il semble que quelque chose ne se déclenche pas dans le bon ordre.Parce que l'exception se produit avant que VS n'entre dans la méthode HTTPPOST CREATE.

J'ai trouvé le code de l'exemple ASP.Net MvcMusicStore utile. http://mvcmusicstore.codeplex.com/releases/view/44445#DownloadId=119336

Il semble que la liaison au ViewModel résolve le problème.

namespace MvcMusicStore.ViewModels
{
    public class StoreManagerViewModel
    {
        public Album Album { get; set; }
        public List<Artist> Artists { get; set; }
        public List<Genre> Genres { get; set; }
    }
}
........

namespace MvcMusicStore.Models
{
    [MetadataType(typeof(AlbumMetaData))]
    public partial class Album
    {
        // Validation rules for the Album class

        [Bind(Exclude = "AlbumId")]
        public class AlbumMetaData
        {
            [ScaffoldColumn(false)]
            public object AlbumId { get; set; }

            [DisplayName("Genre")]
            public object GenreId { get; set; }

            [DisplayName("Artist")]
            public object ArtistId { get; set; }

            [Required(ErrorMessage = "An Album Title is required")]
            [StringLength(160)]
            public object Title { get; set; }

            [DisplayName("Album Art URL")]
            [StringLength(1024)]
            public object AlbumArtUrl { get; set; }

            [Required(ErrorMessage = "Price is required")]
            [Range(0.01, 100.00, ErrorMessage="Price must be between 0.01 and 100.00")]
            public object Price { get; set; }
        }
    }
}

Ashish Shakya de réponse m'a aidé. J'ai ajouté cet attribut à la propriété et maintenant il fonctionne.

[DisplayFormat(ConvertEmptyStringToNull = false, NullDisplayText="")]

Il ressemble à ceci:

    [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
    [DataMemberAttribute()]
    [DisplayFormat(ConvertEmptyStringToNull = false, NullDisplayText="")]
    public global::System.String MyProperty
    {
        get
        {
            return _MyProperty;
        }
        set
        {
            OnMyPropertyChanging(value);
            ReportPropertyChanging("MyProperty");
            _MyProperty = StructuralObject.SetValidValue(value, false);
            ReportPropertyChanged("MyProperty");
            OnMyPropertyChanged();
        }
    }

Importer l'espace de noms:

using System.ComponentModel.DataAnnotations;

Et ajoutez la propriété attribut [Required]

[Required]
public global::System.String MyProperty
    {
        get
        {
            return _MyProperty;
        }
        set
        {
            OnMyPropertyChanging(value);
            ReportPropertyChanging("MyProperty");
            _MyProperty = StructuralObject.SetValidValue(value, false);
            ReportPropertyChanged("MyProperty");
            OnMyPropertyChanged();
        }
    }

Ainsi ModelState.IsValid est false, montrant un message d'erreur dans la validation et ne manquera pas sur le serveur avec Null.

J'ai eu le même problème et le fixe en faisant false à true comme ceci:

Line 4502:
_Text = StructuralObject.SetValidValue(value, false);

Je viens d'avoir moi-même le même problème, et je suis venu ici pour trouver la solution. Cependant, la réponse peut être améliorée.

Svavar et de HackITMngr étaient sur la bonne voie, mais la combinaison donne à la fois le meilleur résultat. Vous ne voulez pas aller décorer les classes générées, que vous risquez de perdre vos modifications personnalisées sur des modifications au modèle EF.

[MetadataType (typeof (MyTableMetaData))]     MyTable classe partielle publique     {         // Les règles de validation pour la classe Album

    public class MyTableMetaData
    {
        [DisplayFormat(ConvertEmptyStringToNull = false, NullDisplayText="")]
        public string MyTextProperty { get; set; }
    }
}

Pour régler les arguments entre les deux. Je dirais que ce Svavar était la réponse directe, HackITMngr était l'amélioration.

fonctionne très bien pour moi!

Je mis la propriété StoreGeneratedPattern calculé pour chaque champ et il a résolu le problème pour moi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top