当您在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窗体代码的任何地方使用这些变量。
当你说“代码隐藏类”,你是什么意思(比如,像一个的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