为什么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窗体代码中的任何位置使用这些变量.
你也可以像这样声明你的常量:
<script runat="server">
private const string scriptPath = "assets/scripts/";
private const string gkoConfig = "GkoConfig.js";
</script>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8788 次 |
| 最近记录: |