scope - directives - link angularjs directive
Alcance variable en la página aspx (3)
¿Por qué la variable scriptPath
está fuera del alcance en la parte inferior del código?
¿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?
Si cambio la posición del código, se vuelve más raro ya que dentro de <head>
ya no tengo acceso a la variable, pero sí tengo, dentro del <body>
now ...: - /
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 separados para todas las etiquetas marcadas como runat="server"
, por lo que realmente 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 precompila su aplicación usando 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 mínimo de tu código con la variable declarada fuera de la etiqueta principal, y aquí está el método de renderizado de nivel superior que obtuve:
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");
}
Verá que la variable que he declarado (aquí denominada str
) tiene un alcance para este método, y está llamando a otros métodos para representar la cabecera (y un elemento de formulario marcado como runat="server"
).
Una solución rápida y sucia podría ser simplemente eliminar el runat="server"
de su etiqueta principal; Sin embargo, le recomendaría que declare una variable protegida en su clase de código subyacente para esto. Agregar una línea como esta a su archivo de código subyacente funcionaría:
protected string scriptPath, gkoConfig;
A continuación, puede usar estas variables en cualquier lugar en su código de formularios web.
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.
También podría declarar sus constantes así:
<script runat="server">
private const string scriptPath = "assets/scripts/";
private const string gkoConfig = "GkoConfig.js";
</script>