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; }
}
źródło
You have to abandon statelessness.
- Właśnie wybrałeś użycie MVC bez sensu.Odpowiedzi:
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:
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.
źródło
Domyślnie powinieneś mieć identyfikator, nawet jeśli go nie używasz. Utwórz kolumnę w bazie danych o nazwie jako
id
i zaznaczauto increment
nad nią funkcję, aby zostać posortowanym.źródło