2012-03-26 15 views
13

Perché la variabile scriptPath è fuori ambito nella parte inferiore del codice?Ambito variabile nella pagina aspx

Non dovrebbe essere incluso in questa pagina? In MVC, se contrassegno questo in cima alla pagina come

@{ 
    string scriptPath = "assets/scripts/", 
      gkoConfig = "GkoConfig.js"; 
} 

è disponibile in tutta la vista corrente. Cosa mi manca adesso che torno a WebForms per un po '?

enter image description here

Se cambio la posizione di codice, è ottenere di più strano come all'interno del <head> non ho più accesso a teh variabile, ma ho, all'interno del <body> ora ...: -/

enter image description here

risposta

13

Quando si dichiara una variabile in un file .aspx di Web Form, in realtà si dichiara una variabile locale all'interno di un metodo di rendering generato automaticamente. ASP.NET genera metodi di rendering separati per tutti i tag contrassegnati con runat="server", in modo da ottenere effettivamente un metodo separato per l'elemento principale. Ora, la variabile dichiarata può esistere solo in uno di questi metodi - da qui il comportamento "strano".

Si può vedere come funziona se si pre-compile your application using aspnet_compiler.exe. Otterrete i file DLL compilati per ciascuna delle pagine dei moduli Web; basta aprire uno di quelli in Reflector per vedere il codice generato. Ho scritto un equivalente minima del codice con la variabile dichiarata al di fuori del tag head, ed ecco la top-level metodo che ho ottenuto il rendering:

private void __Render__control1(HtmlTextWriter __w, Control parameterContainer) 
{ 
    string str = "scripts/"; 
    __w.Write("\r\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\r\n\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n"); 
    parameterContainer.Controls[0].RenderControl(__w); 
    __w.Write("\r\n<body>\r\n "); 
    parameterContainer.Controls[1].RenderControl(__w); 
    __w.Write("\r\n <script type=\"text/javascript\" src=\""); 
    __w.Write(str); 
    __w.Write("jquery-1.4.1.min.js\"></script>\r\n</body>\r\n</html>\r\n"); 
} 

si vede che la variabile che ho dichiarato (qui chiamato str) è ambito a questo metodo e chiama altri metodi per rendere la testa (e un elemento del modulo contrassegnato runat="server".)

Una soluzione rapida e sporca potrebbe essere quella di rimuovere semplicemente il runat="server" dal tag principale; tuttavia, ti consiglio di dichiarare una variabile protetta nella tua classe code-behind per questo. L'aggiunta di una linea come questa al file code-behind avrebbe funzionato:

protected string scriptPath, gkoConfig; 

è quindi possibile utilizzare queste variabili qualsiasi punto del codice Web Form.

+0

Quando si dice "classe code-behind", che cosa vuoi dire (per esempio, per una pagina come Index.aspx)? – serhio

+0

La classe code-behind è la classe dichiarata nel file .cs per la pagina, ad esempio index.aspx.cs per index.aspx. –

+0

ok, capito. Ho iniziato a studiare MVC direttamente senza avere esperienza ASP "classica" per questo non l'ho capito inizialmente .. Grazie! – serhio

0

Sospetto che il capo della pagina ASPX venga elaborato separatamente dal corpo.

Questo problema è facilmente risolvibile. Tutto ciò che devi fare è utilizzare un campo classe nel code-behind con il livello di accesso impostato su protetto.

3

Si potrebbe anche dichiarare le costanti in questo modo:

<script runat="server"> 
    private const string scriptPath = "assets/scripts/"; 
    private const string gkoConfig = "GkoConfig.js"; 
</script> 
Problemi correlati