2009-12-13 9 views
6

Mi piace utilizzare il metodo di estensione RenderAction sull'oggetto HtmlHelper per eseguire il rendering di barre laterali e simili nelle pagine, in quanto consente di mantenere il codice di accesso ai dati per ciascuna di tali parti in metodi separati sul controller. Usando una base di controller astratta, posso definire una "strategia sidebar" predefinita, che può quindi essere ridefinita sovrascrivendo il metodo in un controller concreto, quando necessario.Come Html.RenderAction() ma senza reintegrare l'oggetto controller

L'unico "problema" che ho con questo approccio, è che il RenderAction è costruito in un modo in cui crea sempre un'istanza di notizie della classe controller, anche quando si eseguono azioni dal controller già in azione. Alcuni dei miei controller eseguono alcune ricerche di dati nel loro metodo Initialize e l'utilizzo del metodo RenderAction nella vista fa sì che ciò si verifichi più volte nella stessa richiesta.

Esiste un'alternativa a RenderAction che riutilizzerà l'oggetto controller se il metodo di azione da richiamare si trova sulla stessa classe di controller dell'azione "padre"?

+0

Perché questo è un problema per voi? Non fai l'ottimizzazione prematura? – queen3

+0

@ queen3: Forse, ma non è questa la domanda :) –

risposta

1

È possibile chiamare questo [ActionName] nel controller.

ad es. This.Index() nel metodo di azione About del controller home causerebbe la visualizzazione dell'indice in rendering senza dover nuovamente eseguire l'inizializzazione del controller. Questo funzionerà solo per un'intera pagina.

Un renderPartial potrebbe funzionare per te, ma dovresti assicurarti che gli "elementi" (barre laterali ecc.) Abbiano tutti i dati di cui hanno bisogno nel modello di visualizzazione del genitore.

ad esempio RenderPartial ("SideBars", ViewData.Model). Se ViewModel contiene tutto il necessario per le parziali, è possibile aggiungerle in cima alle viste condivise e il controller deve solo impostare ViewMoel iniziale.

Gentilezza,

Dan

+0

Con 'RenderPartial()' la vista indica esplicitamente quale vista parziale includere nella mia barra laterale, e il controllore deve fornire i dati per questa anticipazione parziale. Con 'RenderAction()' il controllore può decidere cosa sta succedendo nella barra laterale e qualsiasi accesso ai dati richiesto per la barra laterale può essere posticipato fino a quando non viene presa questa decisione. Entrambi i metodi hanno casi d'uso, ma per quello che sto cercando di fare, credo che 'RenderAction()' sia la soluzione migliore. –

Problemi correlati