2012-03-26 23 views
13

¿Por qué la variable scriptPath es fuera del alcance en la parte inferior del código?Alcance de variable en la página aspx

¿No debería estar dentro del alcance de esta página? En MVC, si marcó esto en la parte superior de la página como

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

está disponible en toda la Vista actual. ¿Qué me estoy perdiendo ahora que vuelvo a WebForms por un tiempo?

enter image description here

Si cambio la posición del código, es más raro conseguir dentro de la <head> ya no tengo acceso a teh variable, pero sí tengo, dentro de la <body> ahora ...: -/

enter image description here

Respuesta

13

Cuando declara una variable en un archivo .aspx de Web Forms, en realidad está declarando una variable local dentro de un método de representación generado automáticamente. ASP.NET genera métodos de representación por separado para todas las etiquetas marcadas runat="server", por lo que en realidad obtienes un método separado para tu elemento principal. Ahora, la variable que declaras solo puede existir en uno de estos métodos, de ahí el comportamiento "extraño".

Puede ver cómo funciona esto si pre-compile your application using aspnet_compiler.exe. Obtendrá archivos DLL compilados para cada una de sus páginas de formularios web; simplemente abra uno de ellos en Reflector para ver el código generado. Escribí un equivalente al mínimo su código con la variable declarada fuera de la etiqueta de la cabeza, y aquí está el nivel superior método que llegué imagen:

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"); 
} 

se ve que la variable que declaré (aquí llamado str) es con este método, y está llamando a otros métodos para representar el encabezado (y un elemento de formulario marcado runat="server".)

Una solución rápida y sucia podría ser simplemente eliminar el runat="server" de la etiqueta de la cabeza; Sin embargo, le recomendaría que declare una variable protegida en su clase de código subyacente para esto. Adición de una línea como esta en el archivo de código subyacente funcionaría:

protected string scriptPath, gkoConfig; 

continuación, puede utilizar estas variables en cualquier parte de su código de formularios web.

+0

cuando dice "clase de código subyacente", ¿qué quiere decir (por ejemplo, para una página como Index.aspx)? – serhio

+0

La clase de código subyacente es la clase declarada en el archivo .cs para la página, por ejemplo, index.aspx.cs para index.aspx. –

+0

bien, entendido. Comencé a aprender MVC directamente sin tener una experiencia ASP "clásica". Por eso no entendí al principio ... ¡Gracias! – serhio

0

Sospecho que el encabezado de la página ASPX se procesa por separado del cuerpo.

Este problema se resuelve fácilmente: todo lo que necesita hacer es usar un campo de clase en el código subyacente con el nivel de acceso configurado como protegido.

3

También podría declarar las constantes de la siguiente manera:

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