Frage

VS 2010 Beta 2, .NET 4.

In meiner ASP.NET MVC 2 Anwendung, wenn ich ein Formular an eine Aktionsmethode vorzulegen, die ein Objekt durch das Entity Framework erstellt akzeptiert, ich die folgende Fehlermeldung erhalten:

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();

Die Unterkunft ist im "Text" genannt und ist vom Typ "text NOT NULL" in MS SQL 2008.

Meine Aktion prüft, ob der Wert nullorempty ist, wenn es ist, wird ein Modellfehler hinzugefügt werden, aber ich den Fehler so schnell wie ich das Formular aus.

War es hilfreich?

Lösung

Bindung direkt an das Unternehmen? Sicher sieht aus wie es. So haben Sie zwei Möglichkeiten:

  1. Schreiben Sie ein benutzerdefiniertes Modell Bindemittel, das null übersetzt. -> leere Zeichenfolge
  2. Bind zu einem Bearbeitungsmodell, das NULL-Werte stattdessen erlaubt, und diese dann in leere Zeichenkette ändern, wenn Sie die Werte in die Einheit in der Aktion kopieren.

würde ich persönlich # 2, wählen. Ich denke, Sie sollten immer view / edit Modelle verwenden, und dies ist ein gutes Beispiel dafür, warum.

Andere Tipps

Ich habe das gleiche Problem. Ich sah mich um und fand hier eine Arbeit. Es beschreibt das Problem, wie durch die EF-Validierung verursacht wird statt, bevor die Validierung Pflichtfeld nehmen. Es zeigt auch, wie wir durch die Verwendung eines [DisplayFormat] Tag dieses Problem umgehen können. Hoffe, das wird Ihnen helfen.

Hier ist der Link auf die Frage und die Abhilfe:

Server -side Validierung eines Required String Eigenschaft in MVC2 Entity Framework 4 funktioniert nicht

Ist das ein Problem mit dem MVC2 und Entity Framework 4 oder ist dies durch Design? Es scheint, dass die Validierung von EF Eigenschaften funktioniert gut für Datetime nicht-nullable (erforderlich) Felder und Datentyp Validierung von numerischem Vergleich String-Felder arbeiten ohne Viewmodel zu verwenden.

ich das Problem neu mit einer einfachen FOOBAR Tabelle unter Verwendung einen einzigen, nicht-nullable varchar (50) Spalte barName in slq 2008 genannt erzeugen ich das EF-Modell aus dieser Datenbank und schnell einen Controller hinzugefügt und eine CREATE Ansicht für die FOOBAR Einheit. Wenn ich POST an die CREATE Aktion versuchen, ohne für die Eigenschaft barName in einem Wert eingeben, werden die Schritte VS in eine Ausnahme innerhalb der designer.cs Datei des Modells (genau wie der oben). Wenn ich auf Schritt Vergangenheit Ausnahme versuchen, bis die Validierungsnachricht zeigt auf dem Formular und das Feld in rosa markiert.

Es scheint, wie etwas in der richtigen Reihenfolge nicht feuern. Da die Ausnahme auftritt, bevor VS die Httppost CREATE Verfahrensschritte in.

fand ich den Code aus der ASP.Net MvcMusicStore Probe hilfreich. http://mvcmusicstore.codeplex.com/releases/view/44445#DownloadId= 119.336

Es scheint, dass mit dem Viewmodel Bindung das Problem behebt.

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; }
        }
    }
}

Antwort Ashish Shakya hat mir geholfen. Ich habe dieses Attribut auf das Grundstück und jetzt funktioniert es.

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

So ist es wie folgt aussieht:

    [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();
        }
    }

Import der Namespace:

using System.ComponentModel.DataAnnotations;

Und fügen Sie das Attribut Eigenschaft [Required]

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

So ModelState.IsValid falsch entspricht, Fehlermeldung bei der Validierung zeigt und nicht auf dem Server mit Null nicht.

Ich hatte das gleiche Problem und reparierte sie durch false zu true wie dies zu machen:

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

ich das gleiche Problem selbst gerade hatte, und kam hier die Lösung zu finden. Allerdings kann die Antwort verbessert werden.

Svavar ist und HackITMngr waren auf dem richtigen Weg, aber die Kombination von sowohl das beste Ergebnis liefert. Sie wollen nicht die generierten Klassen gehen, die Dekoration, wie Sie Ihre benutzerdefinierten Änderungen auf Änderungen an dem EF-Modell zu verlieren riskieren.

[MetadataType (typeof (MyTableMetaData))]     public partial class MyTable     {         // Validierungsregeln für die Album-Klasse

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

Um alle Argumente zwischen den beiden zu begleichen. Ich würde sagen, Svavar Jahren war die direkte Antwort war HackITMngr die Erweiterung.

Funktioniert gut für mich!

Ich habe StoreGeneratedPattern Eigenschaft als Computed für jedes Feld und es löste das Problem für mich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top