2012-03-26 84 views
13

为什么scriptPath变量是超出范围在代码的底部?aspx页面中的变量范围

是不是整个页面范围内?在MVC,如果我上标出像

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

它可在整个当前查看页面的顶部。现在我又回到WebForms一段时间了,我在想什么?

enter image description here

如果我更改代码位置,它得到的怪异作为<head>里面我不再有机会获得格兰变量,但我有,在里面<body>现在...: -/

enter image description here

回答

13

当您在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窗体代码的任何地方使用这些变量。

+0

当你说“代码隐藏类”,你是什么意思(比如,像一个的Index.aspx页)? – serhio 2014-04-18 07:27:40

+0

代码隐藏类是在.cs文件中为页面声明的类,例如index.aspx.cs for index.aspx。 – 2014-04-19 01:47:09

+0

好的,理解。我开始直接学习MVC,没有“经典”ASP经验,这就是为什么我最初不明白。谢谢! – serhio 2014-04-23 12:39:59

0

我怀疑ASPX页面的头部是从身体分开处理的。

此问题很容易解决 - 您只需在代码隐藏中将访问级别设置为受保护的类字段。

3

您也可以宣布你的常量是这样的:

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