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.
fonte
2012-06-08 18:29:54
Quando si dice "classe code-behind", che cosa vuoi dire (per esempio, per una pagina come Index.aspx)? – serhio
La classe code-behind è la classe dichiarata nel file .cs per la pagina, ad esempio index.aspx.cs per index.aspx. –
ok, capito. Ho iniziato a studiare MVC direttamente senza avere esperienza ASP "classica" per questo non l'ho capito inizialmente .. Grazie! – serhio