aspx页面中的变量范围

时间:2012-03-26 13:08:40

标签: scope webforms

为什么代码底部的scriptPath变量超出范围

不应该在整个页面的范围内吗?在MVC中,如果我在页面顶部标记为

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

它在整个当前视图中可用。现在我回到WebForms一段时间后,我错过了什么?

enter image description here

如果我更改了代码位置,它会在<head>内部变得更奇怪我不再能够访问teh变量,但我确实已经在<body>内了... : - /

enter image description here

3 个答案:

答案 0 :(得分:13)

在Web窗体.aspx文件中声明变量时,实际上是在自动生成的渲染方法中声明局部变量。 ASP.NET为标记为runat="server"的所有标记生成单独的呈现方法,因此您实际上为头元素获取了一个单独的方法。现在,您声明的变量只能存在于其中一种方法中 - 因此是“怪异”行为。

如果您pre-compile your application using aspnet_compiler.exe.,您可以看到这是如何工作的。您将获得每个Web表单页面的编译DLL文件;只需在Reflector中打开其中一个以查看生成的代码。我用head标签之外声明的变量编写了一个最小等价的代码,这里是我得到的顶级渲染方法:

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窗体代码中的任何位置使用这些变量。

答案 1 :(得分:4)

您也可以声明这样的常量:

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

答案 2 :(得分:0)

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

这个问题很容易解决 - 您需要做的就是在代码隐藏中使用一个类字段,并将访问级别设置为受保护。