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

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

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


当前回答

我只是通过反复试验得出了这个结论: 需要Runat ="server"在服务器端运行时访问元素。 删除它们,重新编译,看看会发生什么。

其他回答

在向ASP提交数据时。在服务器应用程序中,Runat = " server "所提到的控件将表示为Dot NET对象。您可以手动在HTML控件中键入代码,或者通过在设计视图中单击右键使用Run As Server选项。 ASP。一旦你将它从工具箱中拖出,NET控件将自动获得此属性,而通常HTML控件不会。

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

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

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

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

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

微软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"。

我认为微软可以通过让编译器在页面编译之前添加runat属性来解决这种歧义,就像java在泛型中所具有的类型擦除一样,而不是擦除,它可以在看到asp:标签前缀的任何地方写入runat=server,因此开发人员不需要担心它。

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

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

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