为什么代码底部的scriptPath
变量超出范围?
不应该在整个页面的范围内吗?在MVC中,如果我在页面顶部标记为
@{
string scriptPath = "assets/scripts/",
gkoConfig = "GkoConfig.js";
}
它在整个当前视图中可用。现在我回到WebForms一段时间后,我错过了什么?
如果我更改了代码位置,它会在<head>
内部变得更奇怪我不再能够访问teh变量,但我确实已经在<body>
内了... : - /
答案 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页面的头部与身体分开处理。
这个问题很容易解决 - 您需要做的就是在代码隐藏中使用一个类字段,并将访问级别设置为受保护。