aspx页面中的变量范围

bal*_*dre 14 scope webforms

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

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

@{
    string scriptPath = "assets/scripts/",
           gkoConfig = "GkoConfig.js";
}
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

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

在此输入图像描述

Nik*_*bas 13

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

如果使用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");
}
Run Code Online (Sandbox Code Playgroud)

你看到我声明的变量(此处命名str)是作用于此方法的变量,并且它调用其他方法来渲染头部(以及标记的表单元素runat="server".)

一个快速而肮脏的解决方案可能是简单地runat="server"从头标签中删除; 但是,我建议您在代码隐藏类中为此声明一个受保护的变量.将这样的行添加到代码隐藏文件中将起作用:

protected string scriptPath, gkoConfig;
Run Code Online (Sandbox Code Playgroud)

然后,您可以在Web窗体代码中的任何位置使用这些变量.


Ros*_*res 5

你也可以像这样声明你的常量:

<script runat="server">
    private const string scriptPath = "assets/scripts/";
    private const string gkoConfig = "GkoConfig.js";
</script>
Run Code Online (Sandbox Code Playgroud)