2009-11-09 18 views
6

Sono novizio per ASP.NET MVC 1.0. Sto convertendo da una classica applicazione creata con VS2008 .NET3.5. Ho creato una pagina principale e il menu deve essere letto dal database. Ora il codice che genera l'HTML nel div menu appropriato nel classico ASP.NET3.5 VS2008 era nel codice retrostante della pagina principale.ASP.NET MVC: codice dietro alle pagine master

Non riesco a capire ora dove si trova il codice della pagina principale in ASP.NET MVC 1.0?

Chiunque ha degli esempi?

Grazie

risposta

3

la pagina master è ora a View, e viste dovrebbero essere passivo. In altre parole, non dovrebbero andare a cercare le cose da soli.

Sarebbe un approccio molto più corretto (nel contesto di ASP.NET MVC) per estrarre i dati richiesti dal modello.

Dai uno sguardo allo this SO question per una discussione correlata.

+0

Hai un esempio? –

+0

Aggiornato la mia risposta ... –

+0

Penso che l'esempio di riferimento, con gli oggetti ViewModel sia un po 'eccessivo per la domanda. –

7

In MVC non ci sono più classi Code-Behind. Quello che vuoi è un parziale.

usereste in questo modo:

<% Html.RenderPartial("MainMenu.ascx", ViewData["Menu"]); %> 

Se questo menu sarà in tutte le pagine è possibile effettuare i controllori sottoclasse una classe controller personalizzato che riempie sempre i dati del menu prima.

Se scherzi con la gerarchia di ereditarietà MVC è eccessivo si può anche fare una classe MenuController e utilizzare il RenderAction nella vista/master:

<% Html.RenderAction<MenuController>(x => x.MainMenu()); %> 
3

C'è un grande tutorial sul ASP.NET site che mostra come fare esattamente questo

In breve, si passano i dati alla pagina principale tramite la raccolta ViewData. Per ottenere i dati in ViewData, creare un controller di livello applicazione. I controller di pagina sono ereditati dal controller dell'applicazione anziché dal controller MVC di base.

Inoltre, se è necessario eseguire operazioni sulla pagina principale in risposta alla pagina visualizzata, tramite questo controller dell'applicazione è possibile collegarsi all'evento ActionExecuting. Ciò fornirà informazioni sul contesto della richiesta di pagina attualmente in corso di elaborazione.

+0

Questo è un tutorial fantastico, spiega l'opzione di estensione del controller piuttosto bene. –

6

Puoi ancora avere il codice dietro se vuoi. Nel file .Master put:

<%@ Master Language="C#" AutoEventWireup="true" 
Inherits="Site_Master" CodeFile="Site.Master.cs" %> 

Poi, nel tuo .master.cs:

public partial class Site_Master : ViewMasterPage 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
    } 
} 
+2

Si * può * ma per favore non farlo. –

+3

Bene, mi ha chiesto - ho risposto. Inoltre, potrebbe esserci un caso legale, non si sa mai. –

+0

Mi piace il tuo stile. :) –

1

Personalmente, io preferisco usare una vista fortemente tipizzati e ViewModel. Se la tua pagina master richiede dati, quindi crea un ViewModel per questo. Assicurarsi che ViewModel di ogni pagina erediti da questo ViewModel di base. Allo stesso modo, crea un controller di base da cui ogni altro controller eredita. L'uso dei filtri azione ti consentirà di garantire che il master ViewModel venga popolato implicitamente. Vedere this per un esempio.

Problemi correlati