为什么scriptPath变量是在代码底部的超出作用域的?
它不应该在整个页面的范围内吗?在MVC中,如果我在页面顶部标记如下
@{
string scriptPath = "assets/scripts/",
gkoConfig = "GkoConfig.js";
}它可在整个当前视图中使用。现在我回到WebForms有一段时间了,我错过了什么呢?

如果我更改代码位置,它会变得更奇怪,因为在<head>中,我不再能够访问teh变量,但我现在已经在<body>中访问了.*-/

发布于 2012-06-08 18:29:54
在Web .aspx文件中声明变量时,实际上是在自动生成的呈现方法中声明一个局部变量。ASP.NET为标记为runat="server"的所有标记生成单独的呈现方法,因此实际上为head元素提供了一个单独的方法。现在,您声明的变量只能存在于这些方法中的一种--因此出现了“怪异”行为。
您可以看到这是如何工作的,如果您的pre-compile your application using aspnet_compiler.exe.,您将得到编译的DLL文件,为您的每个网页;只要打开其中一个在反射器,以查看生成的代码。我用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)的作用域是该方法,它正在调用其他方法来呈现head (以及标记为runat="server"的表单元素)。
一个快速而肮脏的解决方案可能是从head标记中删除runat="server";但是,我建议您在代码隐藏类中声明一个受保护的变量。将这样的行添加到代码隐藏文件中将有效:
protected string scriptPath, gkoConfig;然后,您可以在Web窗体代码中的任何地方使用这些变量。
发布于 2014-10-15 04:15:32
您还可以像这样声明常量:
<script runat="server">
private const string scriptPath = "assets/scripts/";
private const string gkoConfig = "GkoConfig.js";
</script>发布于 2012-03-30 14:59:39
我怀疑ASPX页面的头与主体是分开处理的。
这个问题很容易解决--您所需要做的就是使用代码隐藏中的类字段--将访问级别设置为受保护。
https://stackoverflow.com/questions/9872712
复制相似问题