Il controller deve passare i dati a una vista nel modello MVC?


11

Lavoro con ASP.NET MVC (e altre implementazioni MVC basate sul web) abbastanza spesso, ma questo è qualcosa di cui non sono mai stato sicuro: il controller e la vista dovrebbero comunicare?

Ovviamente il controller dovrebbe scegliere quale vista utilizzare, ma cosa intendo dire che il controller dovrebbe passare i dati alla vista? Secondo me, se la vista è in attesa di dati dal controller, allora sono effettivamente legati insieme come coppia (controller, vista). Invece, di solito ho la vista di comunicare con il modello stesso ed essere indipendente da qualsiasi controller.

Ho l'approccio giusto o è un caso in cui non esiste una risposta corretta? La risposta cambia quando si lavora nel Web rispetto ad altri ambienti? La risposta cambia quando si ha il concetto di una vista fortemente tipizzata (come in ASP.NET MVC) o no?


Ecco a cosa serve la "M" in "MVC" - il Modello - che rappresenta i dati passati dal Controller alla Vista.
Jay Sullivan,

Risposte:


7

Il controller prepara i dati che verranno ulteriormente passati alla vista per il rendering / visualizzazione. Accetta anche i dati di input dell'utente attraverso un meccanismo di pubblicazione / sottoscrizione o simili. Controlla il primo diagramma sul sito Web di Wikipedia o Martin Fowler per ulteriori informazioni su MVC.

se la vista è in attesa di dati dal controller, sono effettivamente collegati tra loro come coppia (controller, vista).

Mentre una vista generalmente accetta i dati, nella maggior parte dei framework MVC, non dipende da controller specifici. Le eccezioni sono, ad esempio, la famiglia JavaServer Faces. In generale, framework come Rails, Django o Spring MVC consentono di separare le viste dai controller passando i dati (il contesto, comunemente una mappa / dizionario / borsa) a una vista (dove una vista è un'implementazione del modello di vista del modello ).

La risposta cambia quando si ha il concetto di una vista fortemente tipizzata (come in ASP.NET MVC) o no?

Il fatto che il tuo linguaggio di programmazione sia fortemente tipizzato non ha alcuna influenza sul modo in cui stai organizzando la tua applicazione.


Che tipo di dati viene preparato e trasmesso? Prendi un semplice esempio: mostra un articolo in base al suo ID. È l'ID che viene passato dopo la verifica (potrebbe non puntare a un articolo) o il controller ottiene l'articolo dal database e lo trasmette?
Andy Hunt,

Se passi solo l'ID, la tua vista non sta facendo più lavoro del rendering? Dovrebbe recuperare dati che probabilmente non sarebbero nello spirito del modello.
Rig

1

La domanda che stai sollevando viene discussa nel mio team di volta in volta. Discutiamo di due approcci, che hanno entrambi i loro pro e contro.

Il primo, sostiene che il controller può aggiornare la vista con il seguente schema. Ascolta sia la GUI che gli eventi del modello. Quando si verifica un evento GUI, esegue l'azione richiesta nel modello, che a sua volta genera ed evento. Ora il controller di solito aggiorna la vista con i dati richiesti.

Il secondo approccio sostiene che la vista stessa sta ascoltando gli eventi del modello e si aggiorna con i dati che sono collegati all'evento o eseguendo una query sul modello.

Nel primo approccio hai più potere sul controller che controlla realmente tutto ciò che sta accadendo nella tua applicazione. Il potere di decidere in che modo aggiornare la vista in base a quale evento è nelle sue mani e in questo modo mantieni la tua visione pura. Tuttavia, come hai detto, in questo modo hai la vista e il controller accoppiati.

Nel secondo li stai disaccoppiando, ma la tua vista si sta effettivamente controllando in qualche modo.

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.