2016-11-08 3 views
0

Ich habe ein Modell mit Fremdschlüssel:ASP.net: Wie geht man mit nicht-gültiges Modell mit Fremdschlüssel

public class Route : IDbEntity 
{ 
    [Key] 
    public int Id { get; set; } 

    [Display(Name = "Flight number")] 
    [Required(ErrorMessage = "Flight number is required")] 
    public string FlightNumber { get; set; } 

    [Display(Name = "Aircraft")] 
    [Required(ErrorMessage = "Aircraft is required")] 
    public int? AircraftId { get; set; } 

    [ForeignKey("AircraftId")] 
    public virtual Aircraft Aircraft { get; set; } 
} 

Auf Abruf von Show Ansicht oder Edit Ansicht i diese verwenden, um ein Objekt abzurufen:

public new async Task<Route> Get(int id) 
{ 
    return await Context 
     .Set<Route>() 
     .Where(e => e.Id == id) 
     .Include(e => e.Aircraft) 
     .FirstOrDefaultAsync(); 
} 

Und es funktioniert super.

Aber wenn Edit Methode nicht gültiges Modell erhalten, versuchen i Modell View zurückzukehren:

[HttpPost] 
public async Task<IActionResult> Edit(TEntity e) 
{ 
    if (!ModelState.IsValid) return View(e); 

    var isSuccessfull = await service.Update(e); 

    if (!isSuccessfull) return StatusCode(500); 

    return RedirectToAction("Index"); 
} 

Edit Methode erhält Modell, aber mit null Verweise auf Fremdschlüssel.

Und diese Methode gibt das anzuzeigende Modell zurück, aber die Verweise auf das Fremdschlüsselobjekt sind null und die Ansicht kann dieses Objekt nicht korrekt darstellen.

Also, warum Edit-Methode erhalten Modell mit Null-Referenzen? Und wie wird ein ungültiges Modell mit korrekten Referenzen zurückgegeben?

Antwort

1

Beim Postback enthält das ViewModel nur Eigenschaften, für die Sie im HTML-Code <input> gerendert haben.

Es gibt zwei Möglichkeiten, dieses Problem zu lösen:

  • Post alle Eigenschaften, die erforderlich sind, um die Ansicht zu machen. Dann enthält das ViewModel immer diese Werte und sie sind auch im Fehlerfall verfügbar.
  • laden Sie die Daten aus der Datenbank neu und führen Sie sie im Fehlerfall mit dem gebuchten Modell zusammen.

Ich bevorzuge die erste Methode. Nehmen wir an, Sie benötigen die ID und den Namen des Flugzeugs, um die Ansicht zu rendern, aber sie können in dieser Ansicht nicht bearbeitet werden. Dann in Ihrem Edit.cshtml, macht ein verstecktes Feld, diese Eigenschaften zu Rundreise:

@Html.HiddenFor(m => m.Aircraft.Id) 
@Html.HiddenFor(m => m.Aircraft.Name) // property of related object 

PS: Da Sie das Entity-Modell verwenden, um die Ansicht zu machen, das Flugzeug auch aktualisiert werden würde, wenn Sie den ersten Ansatz wählen. Sie können dies verhindern, indem Sie ein ViewModel zum Rendern verwenden und nur die Eigenschaften zuordnen, die tatsächlich in der POST-Edit-Aktion für die Entität bearbeitet werden können.

+0

Was denken Sie über $ .get() Abfrage mit dem Abrufen von Daten in die Seitenelemente, ohne irgendwelche Werte im Modell festgelegt? Ich sende nur GET-Anfrage jedes Mal, wenn Seite bearbeiten geladen und es funktioniert super. Daten - ist ein Primärschlüssel. Es sieht gut aus, denke ich. Aber was hast du darüber gedacht? – Evgeniy175

+1

Wenn ich Ihren Ansatz richtig verstehe, wäre dies der zweiten Möglichkeit ähnlich: Verschmelzen Sie die geposteten Daten mit neuen Daten aus der Datenbank. Sie tun es einfach durch AJAX statt in der Steuerung. Stellen Sie nur sicher, dass Sie die geposteten Daten (d. H. Die neuen Werte der bearbeitbaren Eigenschaften) im Fehlerfall behalten, oder der Benutzer verliert die Eingaben, die er gerade vorgenommen hat. –

+0

Ich sende ID der FK-Entität vom Modell an eine Aktion des Controllers und handle die zurückgegebenen Daten: \t $ .get ('@ Url.Action ("GetAircraft", "Aircraft")), {id: "@ Model.AircraftId"} , Funktion (Daten, Parameter) { \t \t $ ('# aircraftId'). select2 ({data: JSON.parse (data)}); \t}); – Evgeniy175

Verwandte Themen