In ASP.NET MVC, i modelli di vista dovrebbero avere un ID?


11

Quando si sviluppa un'applicazione ASP.NET MVC che consente l'aggiornamento del modello, è necessario un modo per sapere come acquisire il modello di visualizzazione aggiornato e abbinarlo al modello che è ora aggiornato. Sembra che ci siano diversi modi per farlo e mi chiedo se qualcuno di questi non sia un MVC corretto (proprio come avere il controller che memorizza i dati che dovrebbero essere nel modello non è un MVC corretto)?

Tutti i modelli di visualizzazione hanno un ID: Pro

  • Assicurati sempre di poter abbinare il tuo modello.

Contro

  • Devi stare molto attento che nessuno degli ID sia stato cambiato altrimenti puoi avere utenti che aggiornano le righe a cui non dovrebbero avere accesso.

Solo i modelli di vista minima nuda hanno un ID: Pro

  • Molto meno controllo necessario per evitare che gli utenti aggiornino i dati a cui non dovrebbero accedere.

Contro

  • Molto più difficile tenere traccia di quale modello di visualizzazione corrisponde a quale modello.
  • Devi ancora controllare i pochi modelli di visualizzazione con ID per assicurarti che l'utente non stia aggiornando i dati a cui non dovrebbe avere accesso.

Nessun modello di visualizzazione ha un ID:

Professionisti

  • Non è necessario controllare gli ID per gli aggiornamenti.

Contro

  • Devi abbandonare l'apolidia.

Quindi ho due domande.

Innanzitutto, esiste una scelta corretta / errata? (In caso contrario, ciò significa che la scelta è una questione di opinione e la mia seconda domanda si basa sull'opinione e dovrebbe essere ignorata.)

Secondo, se esiste una scelta corretta / errata, quale è?

Per chiarire un commento, sto parlando quando hai un modello di visualizzazione che è un imitazione dell'oggetto del tuo database.

Pensa questo:

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

non questo:

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

2
Cosa faresti esattamente con un ID ViewModel? I singoli oggetti in ViewModel non hanno comunque i propri ID?
Robert Harvey,

Probabilmente dovrei specificare solo quando il modello di vista è correlato a un modello. Non tutti i modelli di vista sono correlati.
Lawtonfogle,

You have to abandon statelessness.- Hai appena fatto la scelta di utilizzare MVC senza senso.
Joel Etherton,

L'ID a cui ti riferisci qui è una chiave primaria del database o qualcos'altro che stai aggiungendo a ViewModel?
Vermis,

@Vermis, penso che una chiave primaria del database sarebbe un semplice ID. Un ID più approfondito sarebbe qualsiasi dato non modificabile che consenta di ricollegare l'oggetto modificato alla versione persistente non ancora modificata in modo che le modifiche modificate possano essere mantenute.
Lawtonfogle,

Risposte:


1

L'oggetto ViewModel non è ciò che viene archiviato in una tabella di database, in generale. Sono i singoli elementi nell'oggetto ViewModel che vengono memorizzati. Ognuno di questi elementi ha già un ID.

Per esempio:

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

Poiché non esiste una tabella singola nel database che corrisponde a InvoiceViewModel, non esiste un ID per un oggetto InvoiceViewModel.

Ovviamente, puoi sempre utilizzare InvoiceID come ID per questo particolare ViewModel. InvoiceID è utile, perché questo è ciò che questo oggetto rappresenta in definitiva. Ma ho potuto vedere avere un oggetto ViewModel che non corrisponde a nessun ID particolare nel database.


1
Pensa dove anziché utilizzare i modelli effettivi nel modello di visualizzazione, InvoiceViewModel contiene solo altri modelli di visualizzazione (che si riferivano ai modelli).
Lawtonfogle,

-1

Per impostazione predefinita, dovresti avere un ID in vista anche se non lo stai utilizzando. Creare una colonna nel database denominata come ide spuntare la auto incrementfunzione su di essa in modo da essere ordinati.


1
Questo però contraddice direttamente l'altra risposta, senza affrontare il motivo per cui dovresti avere comunque un ID .
Martijn Pieters,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.