为什么我必须指定runat="server"在我所有的ASP。在我有限的ASP知识中,服务器是唯一可用的选项。NET,我得到一个错误,如果我不使用它?
我知道我可以选择在我的HTML标记上使用它,我也知道客户机/服务器范例以及它实际指定的内容。
它是一个多余的标记,可以只是暗示控件是一个ASP。NET控制,还是有一个潜在的原因?
为什么我必须指定runat="server"在我所有的ASP。在我有限的ASP知识中,服务器是唯一可用的选项。NET,我得到一个错误,如果我不使用它?
我知道我可以选择在我的HTML标记上使用它,我也知道客户机/服务器范例以及它实际指定的内容。
它是一个多余的标记,可以只是暗示控件是一个ASP。NET控制,还是有一个潜在的原因?
当前回答
在向ASP提交数据时。在服务器应用程序中,Runat = " server "所提到的控件将表示为Dot NET对象。您可以手动在HTML控件中键入代码,或者通过在设计视图中单击右键使用Run As Server选项。 ASP。一旦你将它从工具箱中拖出,NET控件将自动获得此属性,而通常HTML控件不会。
其他回答
它的存在是因为ASP . net中的所有控件都继承自System.Web.UI.Control,后者具有“runat”属性。
在System.Web.UI类中。HTMLControl,这个属性不是必需的,但是在System.Web.UI.WebControl类中,这个属性是必需的。
编辑: 让我说得更具体一点。因为asp.net基本上是HTML的抽象,所以编译器需要某种指令,以便它知道特定的标签需要在服务器端运行。如果该属性不存在,则不知道首先在服务器上处理它。如果它不存在,它会假设它是常规标记并将其传递给客户端。
在向ASP提交数据时。在服务器应用程序中,Runat = " server "所提到的控件将表示为Dot NET对象。您可以手动在HTML控件中键入代码,或者通过在设计视图中单击右键使用Run As Server选项。 ASP。一旦你将它从工具箱中拖出,NET控件将自动获得此属性,而通常HTML控件不会。
我一直相信,它是为了更好地理解你可以混合使用ASP。NET标签和HTML标签,HTML标签可以选择是否为runat="server"。保留标记并不会造成任何损害,并且会导致编译器错误将其删除。关于网络语言,你暗示的东西越多,对一个刚起步的程序员来说,学习它就越不容易。这是一个很好的理由来详细说明标签属性。
这段对话是Mike Schinkel和微软国家服务部的Talbot Crowell在他的博客上进行的。相关信息如下(第一段因出处语法错误而改述):
[…]但是<runat="server">的重要性更多地在于一致性和可扩展性。 如果开发人员必须标记一些标签(即<asp: />)。NET引擎忽略,那么标签之间的名称空间冲突和未来的增强也存在潜在的问题。通过要求<runat="server">属性,这将被否定。
它仍在继续:
如果所有客户端标记都需要<runat=client>,解析器将需要解析所有标记并去掉<runat=client>部分。
他继续说:
目前, 如果我猜对了,解析器 简单地忽略所有文本(标签或no 标记),除非它是带有 Runat =服务器属性或" <% " 前缀或ssi“<!- #include…(…) 此外,由于ASP。NET被设计成 允许网页设计师的分离 (foo.aspx) (foo.aspx.vb),网页设计师可以 使用自己的网页设计工具 放置HTML和客户端JavaScript 而不需要知道ASP。网 特定的标记或属性。
我怀疑这与在处理过程中如何识别服务器端控件有关。它不需要在运行时按名称检查每个控件以确定是否需要进行服务器端处理,而是根据标记对内部节点表示进行选择。编译器检查以确保在验证步骤中所有需要服务器标记的控件都有服务器标记。
如果你在普通的html标签上使用它,这意味着你可以在事件处理程序中编程操作它们,例如在页面加载时改变锚标记的href或类…只有在必要时才这样做,因为普通的HTML标记会更快。
至于用户控件和服务器控件,不,他们只是没有它们就不能工作,没有深入研究aspx预处理器的内部结构,不能确切地说为什么,但可以猜测,可能是出于很好的原因,他们只是这样写解析器,寻找显式标记为“做某事”的东西。
如果@JonSkeet在附近,他可能会提供一个更好的答案。