为什么我可以在没有runat = server的情况下从服务器端访问HTML元素?

时间:2017-08-02 01:10:04

标签: asp.net

<%@ Page Language="C#" %>

<!DOCTYPE html>

<script runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {
        myTr.Visible = false;
        mySpan.Visible = false;
    }
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <table runat="server">
            <tr id="myTr">
                <td>Hello</td>
                <td><span id="mySpan">World</span></td>
            </tr>
            <tr>
                <td>Hi</td>
                <td>Bye</td>
            </tr>
        </table>
    </form>
</body>
</html>

注意myTrmySpan 都没有runat = server ,但编译器只在mySpan.Visible = false上出错。

enter image description here

为什么编译器报告错误myTr.Visible = false

1 个答案:

答案 0 :(得分:1)

我的猜测是您可以访问tr,因为该表在服务器上运行,tr是表本身的一部分。

另一方面,span元素只能从客户端访问,因为它没有在服务器端呈现。

如果您为表的某个td添加了一个id,那么您也可以在服务器端脚本上访问它。但是,如果从表中删除runat="server",则在尝试访问表组件时会出现构建错误。

<table runat="server">
    <tr id="myTr">
        <td id="myTd">Hello</td> <%--This td is also accessible from the server script--%>
        <td><span id="mySpan">World</span></td>
    </tr>
</table>
  

更新:   好的,它不再是猜测了。根据Michael Amundsen和Paul Litwin在他们的书ASP.NET for Developers上的重要解释。你可以看到原因。

根据您的评论总结: 在页136,副标题:表标题(Th),行(Tr)和详细信息(Td)它说:您还可以使用服务器端代码来操作表的th,tr和td标记。 清单8.9使用服务器端代码操作Th,Tr和Td标记与您的非常相似。

基本上只包含runat="server"thtrtd元素的表格,只有id属性(没有runat =&#34; server&#34;)可以从列表顶部的Page_Load事件处理程序中有效地访问。

如果继续阅读,您将看到有关服务器控件的说明以及ASP.NET如何将它们与Html元素匹配。

希望这有帮助!