为什么我必须指定runat="server"在我所有的ASP。在我有限的ASP知识中,服务器是唯一可用的选项。NET,我得到一个错误,如果我不使用它?

我知道我可以选择在我的HTML标记上使用它,我也知道客户机/服务器范例以及它实际指定的内容。

它是一个多余的标记,可以只是暗示控件是一个ASP。NET控制,还是有一个潜在的原因?


当前回答

我怀疑这与在处理过程中如何识别服务器端控件有关。它不需要在运行时按名称检查每个控件以确定是否需要进行服务器端处理,而是根据标记对内部节点表示进行选择。编译器检查以确保在验证步骤中所有需要服务器标记的控件都有服务器标记。

其他回答

HTML元素在ASP。默认情况下,NET文件被视为文本。要使这些元素可编程,可以在HTML元素中添加runat="server"属性。此属性指示应将元素视为服务器控件。

它的存在是因为ASP . net中的所有控件都继承自System.Web.UI.Control,后者具有“runat”属性。

在System.Web.UI类中。HTMLControl,这个属性不是必需的,但是在System.Web.UI.WebControl类中,这个属性是必需的。

编辑: 让我说得更具体一点。因为asp.net基本上是HTML的抽象,所以编译器需要某种指令,以便它知道特定的标签需要在服务器端运行。如果该属性不存在,则不知道首先在服务器上处理它。如果它不存在,它会假设它是常规标记并将其传递给客户端。

我通常不喜欢猜,但这次我要猜了……

如果你还记得微软当年(2001年?)的。net营销炒作,那时候甚至还很难说。net是什么。是服务器吗?一个编程平台?一种语言?全新的东西?考虑到广告,它含糊地是你想要的任何东西——它只是解决了你可能遇到的任何问题。

所以,我猜ASP有一个隐藏的宏伟愿景。.NET代码可以在任何地方运行——服务器端或客户端,在与.NET运行时绑定的Internet Explorer副本中。Runat ="server"只是一个残余,因为它的客户端对等物从未进入生产环境。

还记得那些奇怪的广告吗?

相关:来自The Register的文章,介绍了一些。net历史。

如果你在普通的html标签上使用它,这意味着你可以在事件处理程序中编程操作它们,例如在页面加载时改变锚标记的href或类…只有在必要时才这样做,因为普通的HTML标记会更快。

至于用户控件和服务器控件,不,他们只是没有它们就不能工作,没有深入研究aspx预处理器的内部结构,不能确切地说为什么,但可以猜测,可能是出于很好的原因,他们只是这样写解析器,寻找显式标记为“做某事”的东西。

如果@JonSkeet在附近,他可能会提供一个更好的答案。

我怀疑这与在处理过程中如何识别服务器端控件有关。它不需要在运行时按名称检查每个控件以确定是否需要进行服务器端处理,而是根据标记对内部节点表示进行选择。编译器检查以确保在验证步骤中所有需要服务器标记的控件都有服务器标记。