2009-09-13 10 views
39

Come è possibile accedere a un'istanza del controller dalla vista? Per esempio. Ho un HomeController che restituisce la mia vista Index. All'interno di quella vista voglio accedere all'istanza HomeController che ha creato la vista. Come lo faccio?ASP.NET MVC: visualizzazione dell'istanza del controller di accesso

+0

Come mai la risposta a questo non è "non dovresti" (c.f. https://stackoverflow.com/q/9562214/1739000)? –

risposta

70

ViewContext.Controller, e avrete bisogno di lanciarlo.

<% var homeController = ViewContext.Controller as HomeController; %> 

Questo è coperto con qualche ruga in più in post Asp.Net MVC: How do I get virtual url for the current controller/view?.

EDIT: Questo per aggiungere un po 'di carne alla raccomandazione di Mark Seemann di mantenere la funzionalità fuori dalla vista quanto più umanamente possibile. Se si utilizza il controller per determinare il markup della pagina sottoposta a rendering, è possibile utilizzare il metodo Html.RenderAction(actionName, controllerName). Questa chiamata genererà l'azione come se fosse una richiesta separata e includesse la sua visualizzazione come parte della pagina principale.

Questo approccio aiuterà a rafforzare la separazione delle preoccupazioni perché il metodo di azione reindirizzato può fare tutto il lavoro pesante rispetto alle regole di presentazione. Sarà necessario restituire una vista parziale per funzionare correttamente all'interno della vista principale.

+0

Questo è quello che stavo cercando. Grazie David – Alex

+0

@Alex: felice di aiutare –

+0

@David: RenderAction è disponibile solo nel pacchetto Futures corretto? – Alex

28

A mio parere, è necessario prendere in considerazione un progetto in cui la vista non ha bisogno di conoscere il controller. L'idea è che il controllore si occupi della richiesta, evoca un modello e consegna il modello alla vista. A quel punto, il lavoro del Controller è terminato.

Penso che sia un'indicazione di un difetto di progettazione se la vista deve sapere qualcosa sul controller. Puoi condividere di più su ciò che stai cercando di realizzare?

Spesso trovo che quando si ha a che fare con framework ben progettati (come il framework MVC), se si ha l'impressione che il framework ti stia combattendo, probabilmente stai affrontando il compito nel modo sbagliato. Questo mi è successo molto, e fare un passo indietro e chiedermi cosa stia davvero cercando di ottenere porta spesso a nuove intuizioni.

+1

+1 per quello. Se sono necessarie classi di utilità, dovrebbero di solito entrare nel ViewModel o in un'entità completamente separata, poiché il ciclo di vita dei controllori dovrebbe terminare con il "ritorno". –

+0

Mark: Ho aggiunto alla tua discussione un po 'nel mio stesso post. +1 –

+0

+1 anche da parte mia. Ci ho pensato. Quello che sto facendo è che ho una vista parziale, simile a LogOnUserControl dal normale progetto di avvio per ASP.NET MVC. Visualizza un nome utente (ma non proveniente dal contesto della pagina/IPrincipal - è personalizzato). Il mio controller ha già un servizio che è in grado di fornire il nome utente, quindi preferisco prendere l'istanza dal controller invece di ripetere l'istanziazione nella vista.Non sto usando il modello perché mi piacerebbe approfittare del normale ritorno View() e non incorrere in problemi (ricordate, questo è condiviso, quindi mi servirebbe una classe di base VM ecc. – Alex

Problemi correlati