2010-10-27 12 views
7

Quindi, se esiste qualche stato globale che ogni visualizzazione di un'app MVC dovrà eseguire il rendering ... ad esempio: IsUserLoggedOn e UserName ... qual è il modo appropriato di ottenere tali informazioni per ogni vista?ASP.NET MVC: come gestire i dati del modello che devono passare a ogni vista?

Capisco che quella parte della vista dovrebbe essere nella pagina principale o in una vista parziale che è stata aggiunta alle altre viste. Ma qual è il modo migliore per assicurarsi che i dati del modello "globale" vengano trasmessi alla vista ogni volta da tutti i controllori e le azioni pertinenti?

risposta

6

Dopo aver chiesto questo, ho trovato questo buon post sul blog di Steve Sanderson : http://blog.stevensanderson.com/2008/10/14/partial-requests-in-aspnet-mvc/

Propone tre diversi approcci:

  • usare una classe controller di base o ActionFilter per aggiungere il modello relativo alla raccolta ViewData[] ogni volta. Penso che alcune persone abbiano già suggerito questo genere di cose.

  • Usa Html.RenderAction() nella vista ... e come dice lui:

Se qualcuno vi dice che interne sottorichieste sono male perché esso “non è MVC”, poi solo morso loro su la faccia immediatamente. Chiedi anche a loro perché sono ancora disposti ad usare Ajax, e anche i tag <IMG>, dato che entrambi sono una forma di sottoquest .

  • Usa 'Richieste parziale' (che fornisce il codice per questo su his blog) che consentono un controllore a nido chiamate ad altri controllori in una sortof nidificata ViewData struttura.
+0

+1 RenderAction è la strada da percorrere. Mantiene piacevole SRP – redsquare

3

codeulike - vedere la risposta a una domanda simile chiesto esattamente nello stesso tempo come questo:

ASP.NET MVC displaying user name from a Profile

in poche parole, in pratica creare un controller di base che è ereditata da tutti gli altri controller. il controller di base ha quindi una funzione di override che trasporta 'a tutti i controller' figlio '. piuttosto che duplicare il codice, date un'occhiata alla mia risposta sopra e provarlo ..

applausi ...

2

è possibile creare classe base per ViewModel che contiene informazioni condivise e di ereditare che per ogni ViewModel.

public class ViewModelBase 
{ 
    // shared data 
} 
public class Page1ViewModel : ViewModelBase 
{ 
    // page 1 data 
} 

In masterpage si potrebbe usare quella classe di base

Inherits="System.Web.Mvc.ViewMasterPage<ViewModelBase>" 

ed in ogni vista utilizzare tali classi derivate

Inherits="System.Web.Mvc.ViewPage<Page1ViewModel>" 
+0

Giusto, ma come faccio a compilare quel viewmodel ogni volta? Presumibilmente con un controller di base, giusto? – codeulike

+0

ViewModelBase costruttore/classe helper/classe base controller –

Problemi correlati