Czy w ASP.NET MVC modele widoków powinny mieć identyfikator?

11

Podczas opracowywania aplikacji ASP.NET MVC, która umożliwia aktualizację modelu, musisz wiedzieć, jak pobrać zaktualizowany model widoku i dopasować go z powrotem do modelu, który jest teraz aktualizowany. Wydaje się, że istnieje kilka różnych sposobów na zrobienie tego i zastanawiam się, czy któryś z nich nie jest prawidłowy MVC (podobnie jak posiadanie danych kontrolera, które powinny znajdować się w modelu, nie jest właściwym MVC)?

Wszystkie modele View mają identyfikator: Plusy

  • Zawsze upewnij się, że możesz dopasować do swojego modelu.

Cons

  • Musisz bardzo uważać, aby żaden identyfikator nie został zmieniony, w przeciwnym razie użytkownicy mogą aktualizować wiersze, do których nie powinni mieć dostępu.

Tylko modele z minimalnym widokiem mają identyfikator: zalety

  • Konieczne jest znacznie mniej sprawdzania, aby użytkownicy nie aktualizowali danych, do których nie powinni mieć dostępu.

Cons

  • Znacznie trudniej jest wyśledzić, które modele widoków pasują do jakiego modelu.
  • Nadal musisz sprawdzić kilka modeli widoków z identyfikatorami, aby upewnić się, że użytkownik nie aktualizuje danych, do których nie powinien mieć dostępu.

Żaden model widoku nie ma identyfikatora:

Plusy

  • Nie ma potrzeby sprawdzania identyfikatorów aktualizacji.

Cons

  • Musisz porzucić bezpaństwowość.

Mam więc dwa pytania.

Po pierwsze, czy jest właściwy / niepoprawny wybór? (Jeśli nie, oznacza to, że wybór jest kwestią opinii, a moje drugie pytanie oparte jest na opinii i powinno zostać zignorowane).

Po drugie, jeśli istnieje poprawny / niepoprawny wybór, co to jest?

Aby wyjaśnić komentarz, mówię, gdy masz model widoku, który jest naśladowaniem obiektu bazy danych.

Przemyśl to:

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

nie to:

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
źródło
2
Co dokładnie zrobiłbyś z identyfikatorem ViewModel? Czy poszczególne obiekty w ViewModel i tak nie mają swoich własnych identyfikatorów?
Robert Harvey
Prawdopodobnie powinienem określić tylko wtedy, gdy model widoku jest powiązany z modelem. Nie wszystkie modele widoków są powiązane.
Lawtonfogle
You have to abandon statelessness.- Właśnie wybrałeś użycie MVC bez sensu.
Joel Etherton
Czy identyfikator, o którym tu mowa, jest kluczem podstawowym bazy danych, czy może dodajesz coś innego do ViewModel?
Vermis
@Vermis, myślę, że klucz podstawowy bazy danych byłby prostym identyfikatorem. Bardziej dokładnym identyfikatorem byłby każdy niemodyfikowalny fragment danych, który pozwala powiązać edytowany obiekt z powrotem z nieudytowaną wersją utrwaloną, aby edytowane zmiany mogły zostać utrwalone.
Lawtonfogle

Odpowiedzi:

1

Ogólnie rzecz biorąc, obiekt ViewModel nie jest przechowywany w tabeli bazy danych. Przechowywane są poszczególne elementy w obiekcie ViewModel. Każdy z tych elementów ma już identyfikator.

Na przykład:

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

Ponieważ w bazie danych nie ma jednej tabeli, która odpowiada InvoiceViewModel, nie ma identyfikatora dla obiektu InvoiceViewModel.

Oczywiście zawsze możesz użyć InvoiceID jako identyfikatora dla tego konkretnego ViewModel. InvoiceID jest przydatny, ponieważ to właśnie ten obiekt ostatecznie reprezentuje. Widziałem jednak obiekt ViewModel, który nie odpowiada żadnemu określonemu identyfikatorowi w bazie danych.

Robert Harvey
źródło
1
Zastanów się, gdzie zamiast używać rzeczywistych modeli w modelu widoku, InvoiceViewModel zawiera tylko inne modele widoku (które są powiązane z modelami).
Lawtonfogle
-1

Domyślnie powinieneś mieć identyfikator, nawet jeśli go nie używasz. Utwórz kolumnę w bazie danych o nazwie jako idi zaznacz auto incrementnad nią funkcję, aby zostać posortowanym.

akash
źródło
1
To wprost sprzeczne z inną odpowiedź chociaż bez adresowania dlaczego trzeba mieć identyfikator w każdym razie .
Martijn Pieters