aspx页面中的变量范围
为什么scriptPath
变量是超出范围在代码的底部?aspx页面中的变量范围
是不是整个页面范围内?在MVC,如果我上标出像
@{
string scriptPath = "assets/scripts/",
gkoConfig = "GkoConfig.js";
}
它可在整个当前查看页面的顶部。现在我又回到WebForms一段时间了,我在想什么?
如果我更改代码位置,它得到的怪异作为<head>
里面我不再有机会获得格兰变量,但我有,在里面<body>
现在...: -/
当您在Web Forms .aspx文件中声明变量时,实际上是在自动生成的呈现方法中声明了局部变量。 ASP.NET为所有标记为runat="server"
的标记生成单独的呈现方法,因此您实际上为头元素获取了单独的方法。现在,你声明的变量只能存在于这些方法之一中 - 因此是'怪异'的行为。
你可以看到这是如何工作的,如果你pre-compile your application using aspnet_compiler.exe.你会得到每个网页表单的编译DLL文件;只需在Reflector中打开其中一个即可查看生成的代码。我写你的代码的最小当量与头标记之外声明的变量,这里是顶级渲染方法,我得到:
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");
}
你看到我声明的变量(这里命名str
)是并且调用其他方法来渲染头部(以及标记为runat="server"
的表单元素)。
一个快速和肮脏的解决方案可能是从头标记中简单地删除runat="server"
;不过,我建议你在代码隐藏类中为此声明一个受保护的变量。添加这样一行代码隐藏文件将工作:
protected string scriptPath, gkoConfig;
然后,您可以在您的Web窗体代码的任何地方使用这些变量。
我怀疑ASPX页面的头部是从身体分开处理的。
此问题很容易解决 - 您只需在代码隐藏中将访问级别设置为受保护的类字段。
您也可以宣布你的常量是这样的:
<script runat="server">
private const string scriptPath = "assets/scripts/";
private const string gkoConfig = "GkoConfig.js";
</script>
当你说“代码隐藏类”,你是什么意思(比如,像一个的Index.aspx页)? – serhio 2014-04-18 07:27:40
代码隐藏类是在.cs文件中为页面声明的类,例如index.aspx.cs for index.aspx。 – 2014-04-19 01:47:09
好的,理解。我开始直接学习MVC,没有“经典”ASP经验,这就是为什么我最初不明白。谢谢! – serhio 2014-04-23 12:39:59