2016-09-06 4 views
0

Ich versuche innerhalb von MVC 5 zu erstellen und erhalte einen Validierungsfehler, obwohl der ModelState wieder gültig ist.MVC 5 Validierungsfehler erstellen, aber gültiger ModelState

Fehlermeldung

Validierung fehlgeschlagen für ein oder mehrere Objekte. Weitere Informationen finden Sie unter Eigenschaft 'EntityValidationErrors'.

und wenn ich mir die Nachricht aus, es zeigt ....

Der Name 'e' nicht

im aktuellen Kontext existieren, wenn ich auf der POST aussehen Daten, das Modell, das erstellt wurde, hat alle erforderlichen Felder ausgefüllt. Ich habe festgestellt, dass das Modell ID0 zugewiesen wurde. Ich bin mir nicht sicher, ob das der Fehler ist oder ob es eine Null für die ID geben soll.

Was könnte das Problem sein?

WosController.cs

[HttpPost] 
[ValidateAntiForgeryToken] 
public async Task<ActionResult> Create([Bind(Include = "id,woNumber,woDescription,dueDate,qty,item_id,releaseDate,parentWO_id,wip_id")] Wo wo) 
    { 
     if (ModelState.IsValid) 
     { 
      db.Wos.Add(wo); 
      await db.SaveChangesAsync(); 
      return RedirectToAction("Index"); 
     } 

     return View(wo); 
    } 

Wo.cs

public partial class Wo 
{ 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] 
    public Wo() 
    { 
     this.WoParts = new HashSet<WoPart>(); 
     this.WoStatuses = new HashSet<WoStatus>(); 
    } 

    public int id { get; set; } 
    public string woNumber { get; set; } 
    public string woDescription { get; set; } 
    public Nullable<System.DateTime> dueDate { get; set; } 
    public string qty { get; set; } 
    public Nullable<int> item_id { get; set; } 
    public Nullable<System.DateTime> releaseDate { get; set; } 
    public string status { get; set; } 
    public Nullable<int> parentWO_id { get; set; } 
    public int wip_id { get; set; } 
    public Nullable<int> part_id { get; set; } 

    public virtual Item Item { get; set; } 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
    public virtual ICollection<WoPart> WoParts { get; set; } 
    public virtual Wo woParentWO { get; set; } 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
    public virtual ICollection<WoStatus> WoStatuses { get; set; } 
    public virtual Part Part { get; set; } 
    public virtual Wip Wip { get; set; } 
} 
+1

* einen Validierungsfehler erhalten * .. was ist der Fehler? –

+0

Und wie sieht deine Wo-Klasse aus? – KSib

+2

mit dieser Fehlermeldung .. wie funktioniert es überhaupt? Was ist 'e'? das sollte ein Kompilierzeitfehler und kein Laufzeitfehler sein? Um eine bessere Beschreibung des Fehlers zu erhalten, versuchen Sie es mit einem 'try-catch-Block 'und fangen Sie die Ausnahme ab .. Wenn Sie dann debuggen, wird es Ihnen genau sagen, was passiert ist. –

Antwort

1

Ihren Anruf SaveChangesAsync in einem wie so try...catch Wrap:

try 
{ 
    await db.SaveChangesAsync(); 
} 
catch (DbEntityValidationException e) 
{ 
    var errorMessages = e.EntityValidationErrors 
     .SelectMany(x => x.ValidationErrors) 
     .Select(x => x.ErrorMessage); 
    var fullErrorMessage = string.Join("; ", errorMessages); 
    var exceptionMessage = string.Concat(e.Message, " The validation errors are: ", fullErrorMessage); 
    throw new DbEntityValidationException(exceptionMessage, e.EntityValidationErrors); 
} 

, dass Sie die tatsächlichen Eigenschaften zeigen verursacht die Validierungsprobleme. Dann aktualisieren Sie Ihre Frage mit den Ergebnissen, wenn Sie noch Hilfe benötigen.

+0

ok es zeigt, dass das Feld 'Status' erforderlich ist. Ich habe dieses Feld nicht eingeschlossen, da es einen Standardwert in der SQL Server-DB definiert hat.Warum sucht es nach diesem Feld, wenn es einen Standard in der Datenbank gibt? – Beengie

+0

@Beengie Im Moment weiß Ihre Anwendung nicht, dass ein Standardwert auf 'status' in der Datenbank wartet. Sie müssen ihn jedoch weiterhin in Ihre Bindung aufnehmen. Fügen Sie also 'status' am Ende Ihrer Bindung hinzu. so:' [Bind (Include = "ID, WoNummer, woDescription, DueDate, Menge, Item_ID, ReleaseDate, ParentWO_ID, Wip_ID, Status")] Wo wo) ' –

1

Wahrscheinlich ist Ihre Datenbank nicht mit Ihren Entitäten synchronisiert. Die status-Eigenschaft ist für Ihre Entität nicht erforderlich, und standardmäßig sind Eigenschaften vom Typ string nullfähig. Das würde erklären, warum Sie die Validierung für den Post übergeben, aber nicht die Entität speichern.

Im Allgemeinen ist es am besten, sich nicht darauf zu verlassen, dass die Datenbank zuerst einen Standardwert setzt. Stattdessen haben die Eigenschaft selbst einen Standardwert hat, und dann wird es immer in Ordnung sein, unabhängig davon, was auf Datenbankebene los ist:

private string _status; 
public string status 
{ 
    get { return _status ?? "Default Value"; } 
    set { _status = value; 
} 

Short kommt, dass, wenn Status wirklich nicht erforderlich ist, dann sollten Sie Stellen Sie sicher, dass die status Spalte in Ihrem Tisch nullfähig ist.

Verwandte Themen