Sollten die Ansichtsmodelle in ASP.NET MVC eine ID haben?

11

Wenn Sie eine ASP.NET MVC-Anwendung entwickeln, mit der das Modell aktualisiert werden kann, müssen Sie wissen, wie Sie das aktualisierte Ansichtsmodell verwenden und es wieder mit dem jetzt aktualisierten Modell abgleichen können. Es scheint verschiedene Möglichkeiten zu geben, dies zu tun, und ich frage mich, ob eine davon nicht die richtige MVC ist (ähnlich wie wenn Ihre Controller-Speicherdaten, die im Modell enthalten sein sollten, keine richtige MVC sind).

Alle Ansichtsmodelle haben eine ID: Vorteile

  • Stellen Sie immer sicher, dass Sie zu Ihrem Modell passen können.

Nachteile

  • Sie müssen wirklich vorsichtig sein, dass keine der IDs geändert wurde. Andernfalls können Benutzer Zeilen aktualisieren, auf die sie keinen Zugriff haben sollten.

Nur die Modelle mit bloßer Mindestansicht haben eine ID: Vorteile

  • Es sind weitaus weniger Überprüfungen erforderlich, um zu vermeiden, dass Benutzer Daten aktualisieren, auf die sie nicht zugreifen sollten.

Nachteile

  • Es ist weitaus schwieriger zu verfolgen, welche Ansichtsmodelle mit welchem ​​Modell übereinstimmen.
  • Sie müssen noch die wenigen Ansichtsmodelle mit IDs überprüfen, um sicherzustellen, dass der Benutzer keine Daten aktualisiert, auf die er keinen Zugriff haben sollte.

Keine Ansichtsmodelle haben ID:

Vorteile

  • IDs müssen nicht auf Updates überprüft werden.

Nachteile

  • Sie müssen Staatenlosigkeit aufgeben.

Ich habe also zwei Fragen.

Erstens gibt es eine richtige / falsche Wahl? (Wenn nicht, bedeutet dies, dass die Wahl eine Ansichtssache ist und meine zweite Frage meinungsbasiert ist und ignoriert werden sollte.)

Zweitens, wenn es eine richtige / falsche Wahl gibt, welche ist es?

Um einen Kommentar zu verdeutlichen, spreche ich, wenn Sie ein Ansichtsmodell haben, das Ihr Datenbankobjekt nachahmt.

Denken Sie das:

public class InvoiceViewModel  //Does not have ID, does not relate to model.
{
    public CustomerViewModel CustomerVM { get; set; }  //Maybe has ID?  Does relate to model.
    public AddressViewModel BillingAddressVM { get; set; } //Ditto
    public AddressViewModel ShippingAddressVM { get; set; } //Ditto
    public List<InvoiceLineItemViewModel> ItemVMs { get; set; }  //Each one has an ID?
}

nicht das:

public class InvoiceViewModel
{
    public Customer Customer { get; set; }
    public Address BillingAddress { get; set; }
    public Address ShippingAddress { get; set; }
    public List<InvoiceLineItem> Items { get; set; }
}
Lawtonfogle
quelle
2
Was genau würden Sie mit einer ViewModel-ID tun? Haben die einzelnen Objekte im ViewModel nicht trotzdem eigene IDs?
Robert Harvey
Ich sollte wahrscheinlich nur angeben, wann das Ansichtsmodell mit einem Modell verknüpft ist. Nicht alle Ansichtsmodelle sind verwandt.
Lawtonfogle
You have to abandon statelessness.- Sie haben gerade die Wahl getroffen, MVC sinnlos zu verwenden.
Joel Etherton
Ist die ID, auf die Sie sich hier beziehen, ein Datenbankprimärschlüssel oder etwas anderes, das Sie dem ViewModel hinzufügen?
Vermis
@Vermis, ich denke, dass ein Datenbank-Primärschlüssel eine einfache ID wäre. Eine gründlichere ID wäre jedes nicht veränderbare Datenelement, mit dem Sie Ihr bearbeitetes Objekt auf die noch nicht bearbeitete persistierte Version zurückführen können, damit die bearbeiteten Änderungen beibehalten werden können.
Lawtonfogle

Antworten:

1

Das ViewModel-Objekt wird im Allgemeinen nicht in einer Datenbanktabelle gespeichert. Es sind die einzelnen Elemente im ViewModel-Objekt, die gespeichert werden. Jedes dieser Elemente hat bereits eine ID.

Beispielsweise:

public class InvoiceViewModel
{
    public Customer Customer { get; set; }
    public Address BillingAddress { get; set; }
    public Address ShippingAddress { get; set; }
    public List<InvoiceLineItem> Items { get; set; }
}

Da die Datenbank keine einzelne Tabelle enthält, die einem InvoiceViewModel entspricht, gibt es keine ID für ein InvoiceViewModel-Objekt.

Natürlich können Sie jederzeit die InvoiceID als ID für dieses bestimmte ViewModel verwenden. InvoiceID ist praktisch, denn genau das repräsentiert dieses Objekt letztendlich. Ich konnte jedoch ein ViewModel-Objekt sehen, das keiner bestimmten ID in der Datenbank entspricht.

Robert Harvey
quelle
1
Überlegen Sie, wo InvoiceViewModel anstelle der tatsächlichen Modelle im Ansichtsmodell nur andere Ansichtsmodelle enthält (die sich auf Modelle beziehen).
Lawtonfogle
-1

Standardmäßig sollte eine ID angezeigt werden, obwohl Sie sie nicht verwenden. Erstellen Sie eine Spalte in der Datenbank mit dem Namen idund markieren Sie das auto incrementFeature darüber, damit Sie sortiert werden.

akash
quelle
1
Dies widerspricht jedoch direkt der anderen Antwort, ohne darauf einzugehen, warum Sie sowieso eine ID haben sollten .
Martijn Pieters