Perché ViewModel dovrebbe indirizzare le azioni al controller quando si utilizza il pattern MVCVM?

6

Durante la lettura di esempi su Internet (incluso il riferimento MSDN) ho trovato che gli esempi di codice fanno tutti il seguente tipo di cose:

public class FooViewModel : BaseViewModel {
    public FooViewModel(FooController controller) {
        Controller = controller;
    }
    protected FooController Controller { get; private set; }

    public void PerformSuperAction() {
        // This just routes action to controller...
        Controller.SuperAction();
    }

    ...
}

e quindi per la vista:

public class FooView : BaseView {
    ...

    private void OnSuperButtonClicked() {
        ViewModel.PerformSuperAction();
    }
}

Perché non facciamo solo ciò che segue?

public class FooView : BaseView {
    ...

    private void OnSuperButtonClicked() {
        ViewModel.Controller.SuperAction();

        // or, even just use a shortcut property:
        Controller.SuperAction();
    }
}
    
posta Lea Hayes 23.08.2014 - 05:27
fonte

2 risposte

2

Considera il modello come solo dati . Non fa scelte e non sa come renderizzare.

  • Un prodotto può essere un modello.
  • Un elenco di prodotti può essere un modello.
  • Un pacchetto contenente l'elenco di prodotti, il carrello e le informazioni sull'utente corrente è un modello.

L'ultimo modello della lista corrisponde ai dati è necessario eseguire il rendering della pagina, ma non dovrebbe sapere come eseguire il rendering stesso, perché non è il compito del modello.

Per renderlo, viene usata una vista , dato che il controllore può scegliere diverse viste a seconda del contesto. Ad esempio, verrà utilizzata una vista per il rendering dei dati per un visitatore ospite ordinario, una visualizzazione diversa per un utente autenticato e una terza vista se l'utente è un amministratore. Stessi dati, diverse modalità di visualizzazione.

    
risposta data 06.04.2015 - 20:07
fonte
0

Considera questa una combinazione di due MVC di base (questo presuppone che tu conosca il MVC di base).

La prima coppia MVC più profonda è:

  • M = modello
  • C = controller
  • V = visualizza modello

La seconda coppia MVC superiore è:

  • M = visualizza modello
  • C = compresso / minimo / intersperso ( OnSuperButtonClicked è parte di esso)
  • V = visualizza.

Con questa separazione, ovviamente la vista da una triade non può accedere al modello, né al controller, da un'altra triade.

    
risposta data 06.04.2015 - 20:23
fonte

Leggi altre domande sui tag