MVC con Post / Redirect / Get

2

Ho una domanda in mente per il pattern MVC da molto tempo ormai. Quando si utilizza il principio Post / Redirect / Get, non ha senso utilizzare UN modello nel senso di MVC, giusto? Perché dovrei modificare i dati nel modello se non lo uso più? Mi manca qualcosa?

Quindi ho bisogno di un modello per le azioni nel controller e uno con i dati per la vista?

Il mio modello attuale:

controller

-> call and init model used for actions

-> handle actions using the action model, if an action has been executed, use P/R/G to reload

-> call and init model used for the view

-> call view with template and pass view model

Il punto è che non voglio caricare tutti i dati per la vista se forse non ne ho bisogno a causa del reindirizzamento. O mi sto solo preoccupando troppo?

    
posta tyftler 04.03.2015 - 09:39
fonte

2 risposte

1

In MVC è molto raro avere un singolo modello o controller. È tuttavia comune avere uno o pochi "sapori" di visualizzazione che rendono tutti i modelli in modo diverso.

Ogni controller dovrebbe avere un unico scopo, indipendentemente dal fatto che si tratti di routing o applicazione della logica di business a un modello. È necessario instradare la richiesta al controller appropriato per ciascun modello, separando idealmente la gestione POST e GET in funzioni separate. Se POST, salva e reindirizza. Se ottieni, visualizza la vista.

  • Modello = Dati strutturati. Genera eccezioni di validazione. Può contenere logica di archiviazione.
  • Controller = Routing e business logic. Funziona su modelli direttamente o tramite un altro controller. Assegna i dati di presentazione alle viste, come modelli, intestazioni, sotto-viste, ecc. Si muove con grazia su errori.
  • Visualizza = Presentazione. Usa qualunque cosa sia data in modo di sola lettura. Non dovrebbe produrre errori.

Se stai chiedendo se è corretto inizializzare il modello per ogni tipo di richiesta, la risposta è probabilmente sì, a meno che la tua convalida POST sia incredibilmente semplice e sia consentita la cancellazione di record esistenti.

    
risposta data 19.05.2015 - 10:59
fonte
0

Tutti i dati nella tua vista provengono dall'ultimo GET, sono già stati caricati, elaborati e dimenticati. L'azione POST sta semplicemente aggiornando alcuni di essi. Ciò che viene ricaricato durante il POST dipende solo dal modello e da come viene utilizzato.

Il motivo dell'approccio Post / Redirect / Get nella mia esperienza è quello di prevenire il problema comune della ri-pubblicazione dei dati quando si utilizzano i pulsanti "indietro" e "avanti" in un browser. I reindirizzamenti accadono lato server e il browser getta via il POST dalla sua storia. Ciò inoltre impedisce all'utente di contrassegnare con un segnalibro l'URL POST perché sta visualizzando la vista GET di cui desidera fare riferimento in seguito.

Una volta che il reindirizzamento avviene, qualsiasi stato che hai nell'azione POST viene perso, questo include tutti i modelli che sono stati richiamati. Tuttavia, potrebbe anche essere che il modello di azione POST non avesse comunque tutti i dati caricati (come l'aggiornamento di un indirizzo di ordine), pertanto il GET avrebbe dovuto arricchirlo con un altro modello (come gli elementi pubblicitari in un ordine) .

Questo presuppone che tu non stia facendo molte cose dinamiche AJAX e / o lato client qui. Che ogni vista è tutti i dati recuperati in una richiesta.

    
risposta data 09.03.2015 - 16:06
fonte

Leggi altre domande sui tag