为什么
问题描述:
考虑以下两个最小的例子。为什么<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>