2016-09-08 4 views
0

Ich versuche, einen neuen Datenbankeintrag in ASP.NET MVC mit einer ersten Code-Datenbank zu erstellen. Ich habe den Controller für das Modell mit Scaffolding und Ansichten erstellt und jedes Mal, wenn ich versuche, einen POST zu erstellen, ist das Modell niemals gültig. Die beiden Modelle, die zu demjenigen gehören, den ich erstellen möchte, sind immer null.Code zuerst Beitrag erstellen

Unten ist der Code für den Create POST in meinem Controller.

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create([Bind(Include = "DeviceNumber,ManufacturerNumber,CarrierNumber,Name")] Device device) 
{ 
    if (ModelState.IsValid) 
    { 
     db.Devices.Add(device); 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 

    ViewBag.CarrierNumber = new SelectList(db.Carriers, "CarrierNumber", "CarrierID", device.CarrierNumber); 
    ViewBag.ManufacturerNumber = new SelectList(db.Manufacturers, "ManufacturerNumber", "ManufacturerID", device.ManufacturerNumber); 
    return View(device); 
} 

Das folgende ist das Modell, das ich versuche zu erstellen. Die Fehler im ModelState sagen mir immer, dass Hersteller und Carrier null sind, aber sie sind erforderlich.

public class Device 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int DeviceNumber { get; set; } 

    [ForeignKey("ManufacturerNumber"), Required] 
    public virtual Manufacturer Manufacturer { get; set; } 

    public int ManufacturerNumber { get; set; } 

    [ForeignKey("CarrierNumber")] 
    [Required] 
    public virtual Carrier Carrier { get; set; } 

    public int CarrierNumber { get; set; } 

    [Required] 
    public string Name { get; set; } 
} 

Ich habe versucht, den Träger und Hersteller in der Create-Methode zuweisen, aber es führte noch in einem Fehler bei der Überprüfung.

+0

Haben Sie gesehen, warum als ungültig markiert ist? –

+0

Bitte aktualisieren Sie Ihre Frage mit Code anzeigen. Es ist schwer zu erraten, ohne zu sehen. – Jayee

+0

Es ist keine gute Übung, ein Modell zur Ansicht zu senden. Erstellen Sie eine VIewmodel-Klasse und senden Sie sie an die Ansicht. – Jayee

Antwort

0

Sie sollten die Attribute [Required] in den Navigationseigenschaften nicht haben (Manufacturer und Carrier).

Stattdessen behalten Sie es auf den ManufacturerNumber und CarrierNumber Eigenschaften, weil Sie Werte für diese Spalten von der Benutzeroberfläche erhalten.

public class Device 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int DeviceNumber { get; set; } 

    [ForeignKey("ManufacturerNumber")] 
    public virtual Manufacturer Manufacturer { get; set; } 

    [Required] 
    public int ManufacturerNumber { get; set; } 

    [ForeignKey("CarrierNumber")] 
    public virtual Carrier Carrier { get; set; } 

    [Required] 
    public int CarrierNumber { get; set; } 

    [Required] 
    public string Name { get; set; } 
} 

Auch gibt es keine Notwendigkeit DeviceNumber innerhalb Bind als der Wert für diese umfassen wird automatisch erzeugt werden. Das sollte gut genug sein.

Dies sollte funktionieren, vorausgesetzt, Ihre Ansicht hat ein Formular, das Daten für die erforderlichen Felder sendet.

@model Device 
@using (Html.BeginForm()) 
{ 
    @Html.ValidationSummary(false) 

    @Html.LabelFor(f=>f.Name) 
    @Html.TextBoxFor(f=>f.Name) 

    @Html.LabelFor(f => f.CarrierNumber) 
    @Html.DropDownList("CarrierNumber") 

    @Html.LabelFor(f => f.ManufacturerNumber) 
    @Html.DropDownList("ManufacturerNumber") 

    <input type="submit"/> 
} 

Denken Sie daran, the best way to prevent over posting is to use a view model. Dies hilft auch, Ihre Schichten lose gekoppelt zu halten.

Verwandte Themen