为什么标签的“变量范围边界”为ASP.NET内嵌代码?

问题描述:

考虑以下两个最小的例子。为什么<form>标签的“变量范围边界”为ASP.NET内嵌代码?

实施例1:

<%@ Page Language="C#" %> 
<!DOCTYPE html> 
<html> 
<body> 
    <form id="form1" runat="server"> 
     <% string x = "Hello World"; %> 
     <%= x %> 
    </form> 
</body> 
</html> 

实施例2:

<%@ Page Language="C#" %> 
<!DOCTYPE html> 
<html> 
<body> 
    <% string x = "Hello World"; %> 
    <form id="form1" runat="server"> 
     <%= x %> 
    </form> 
</body> 
</html> 

实施例1个编译和运行正如所料,实施例2甚至不编译:

CS0103:名称' x'在当前上下文中不存在。 (行<%= x %>

为什么?服务器端form是否标记了一些神奇的“变量范围边界”?如果是,那么记录在哪里?

也许是因为有runat=server标记的所有元素?下面的示例也不会运行。

<% string x = "Hello World"; %> 
<div id="TestDiv" runat="server"> 
    <%= x %> 
</div> 

可能是因为page life cycle。 aspx代码是最后被渲染的,而具有runat = server的对象的(内容)可以在后面的代码中使用,并且需要在那里访问。 x在那里不可用,因为它只在稍后时间在页面上声明。

注意:这只是我的猜测。

如果使用runat="server"属性在ASP.NET页面中的任何标签(比form标签等),那么你基本上解析在服务器端的标签里面的内容。和页面是System.Web.UI类具有不同的上下文下定义。

Form标记是在简单静态HTML标记的上下文中定义的。

这就是为什么你不能够编译如下:

<% string x = "Hello World"; %> 
<form id="form1" runat="server"> 
    <%= x %> 
</form>