为什么我必须指定runat="server"在我所有的ASP。在我有限的ASP知识中,服务器是唯一可用的选项。NET,我得到一个错误,如果我不使用它?
我知道我可以选择在我的HTML标记上使用它,我也知道客户机/服务器范例以及它实际指定的内容。
它是一个多余的标记,可以只是暗示控件是一个ASP。NET控制,还是有一个潜在的原因?
为什么我必须指定runat="server"在我所有的ASP。在我有限的ASP知识中,服务器是唯一可用的选项。NET,我得到一个错误,如果我不使用它?
我知道我可以选择在我的HTML标记上使用它,我也知道客户机/服务器范例以及它实际指定的内容。
它是一个多余的标记,可以只是暗示控件是一个ASP。NET控制,还是有一个潜在的原因?
当前回答
并非所有可以包含在页面中的控件都必须在服务器上运行。例如:
<输入类型=“submit”runat=服务器/>
这本质上与:
<asp:Button runat=server />
从第一个按钮中删除runat=server标记,您就有了一个在浏览器中运行的标准HTML按钮。支持和反对在服务器上运行特定控件的理由有很多,而ASP。NET根据所包含的HTML标记“假定”您想要的内容。为<asp:XXX />控件家族“推断”runat=server可能是可能的,但我猜微软会认为这是对标记语法和asp。净引擎。
其他回答
我一直相信,它是为了更好地理解你可以混合使用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。网 特定的标记或属性。
我只是通过反复试验得出了这个结论: 需要Runat ="server"在服务器端运行时访问元素。 删除它们,重新编译,看看会发生什么。
我认为微软可以通过让编译器在页面编译之前添加runat属性来解决这种歧义,就像java在泛型中所具有的类型擦除一样,而不是擦除,它可以在看到asp:标签前缀的任何地方写入runat=server,因此开发人员不需要担心它。
任何带有runat=server的标签都被添加为Page中的服务器控件,而两者之间的任何html内容都被处理为LiteralControls,这些LiteralControls也被添加到Page控件集合中。
微软Msdn文章《被遗忘的控件:HTML服务器控件》以文本框<input type="text">为例解释了runat=" Server "的使用,将其转换为<input type="text" id="Textbox1" runat=" Server ">
Doing this will give you programmatic access to the HTML element on the server before the Web page is created and sent down to the client. The HTML element must contain an id attribute. This attribute serves as an identity for the element and enables you to program to elements by their specific IDs. In addition to this attribute, the HTML element must contain runat="server". This tells the processing server that the tag is processed on the server and is not to be considered a traditional HTML element.
简而言之,要启用对HTML元素的编程访问,请在其中添加runat="server"。