考虑以下两个最小的例子。
示例 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>
可能是因为页面生命周期。aspx 代码是最后一个呈现的代码,而具有 runat=server 的对象(内容)可以在代码隐藏中使用,并且需要在那里访问。 x
在那里不可用,因为它仅在以后在页面上声明。
注意:这只是我的猜测。
如果您在 PAGE 中使用 runat="server"
属性来 ASP.NET 任何标签(form
标签除外),那么您基本上是在服务器端解析标签内的内容。PAGE 是在具有不同上下文的 System.Web.UI 类下定义的。
表单标记是在简单静态 HTML 标记的上下文中定义的。
这就是为什么你无法编译它的原因:
<% string x = "Hello World"; %>
<form id="form1" runat="server">
<%= x %>
</form>