为什么标记是 <form> ASP.NET 内联代码的"variable scope boundary"?



考虑以下两个最小的例子。

示例 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>

相关内容

最新更新