Sto lavorando in ASP.NET MVC, ma questa domanda è praticamente applicabile a qualsiasi framework MVC (e forse anche ad altri).
In una tipica applicazione MVC arriva una richiesta al controller, che quindi prepara un oggetto modello e quindi chiama la vista, passando l'oggetto modello come parametro. La vista utilizza quindi i dati nel modello per generare una risposta alla richiesta originale. Qualsiasi dato nell'oggetto modello w può essere liberamente utilizzato dalla vista, ma mi chiedo - è OK per una vista richiedere dati da un'altra parte, come una chiamata diretta a un servizio o qualcosa del genere?
Al primo momento la risposta sembra essere un chiaro "no, perché avresti bisogno di questo? Basta aggiungere tutto ciò che la vista ha bisogno per l'oggetto del modello". Ma sono arrivato a questa domanda mentre lavoravo a un progetto pratico, quindi ecco la mia situazione che mi mette in dubbio:
La vista necessita di molti dati per poter essere visualizzata. In particolare, vi sono i dati dei campi modulo effettivi e anche i dati per tutti i menu a discesa presenti nel modulo (elenchi di valori potenziali per campi diversi).
D'altra parte, nel mio progetto le viste sono modificabili. Cioè, diversi clienti (i nostri clienti, che hanno acquistato il nostro sito Web e lo utilizzano nella loro attività) avranno le visualizzazioni personalizzate per soddisfare le loro esigenze. Diversi clienti hanno bisogno di campi diversi visualizzati, e a volte anche le origini dati per lo stesso menu a discesa possono differire significativamente.
Un modo possibile sarebbe quello di interrogare tutti i dati possibili su ogni richiesta e aggiungerli tutti all'oggetto del modello. Ma ci sarà una penalità significativa per questo. Meglio se sono stati interrogati solo i dati necessari, tuttavia il controllore non sa di cosa avrà bisogno la vista.
Quindi vedo 2 opzioni:
- Consenti alla vista di chiamare le funzioni esterne che restituiscono gli elenchi di valori per i menu a discesa;
- Nell'oggetto modello, aggiungi delegati (o in realtà aggiungi metodi all'oggetto modello) che eseguiranno la query quando la vista glielo chiederà.
Nessun approccio sembra molto elegante per me. Ci sono altre alternative, o se no, qual è la migliore e perché?