【问题标题】:Variable scope in aspx pageaspx 页面中的变量范围
【发布时间】:2012-04-09 23:47:19
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: scope webforms


    【解决方案1】:

    在 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"的表单元素。)

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

    protected string scriptPath, gkoConfig;
    

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

    【讨论】:

    • 当你说“代码隐藏类”时,你是什么意思(比如,对于像 Index.aspx 这样的页面)?
    • 代码隐藏类是在.cs文件中为页面声明的类,例如index.aspx的index.aspx.cs。
    • 好的,明白了。我开始直接学习 MVC,但没有“经典”的 ASP 经验,这就是我最初不理解的原因。谢谢!
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      我怀疑 ASPX 页面的头部与正文分开处理。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-18
        • 1970-01-01
        相关资源
        最近更新 更多