为什么ASP。NET web表单需要Runat="服务器"属性?

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

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

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

143340 次浏览

并非所有可以包含在页面必须中的控件都可以在服务器上运行。例如:

<INPUT type="submit" runat=server />

这本质上与:

<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: />)的ASP。NET引擎忽略,那么标签之间的名称空间冲突和未来的增强也存在潜在的问题。通过要求<runat="server">属性,这将被否定。

它仍在继续:

如果所有客户端标记都需要<runat=client>,解析器将需要解析所有标记并剥离<runat=client>部分。

他继续说:

< p >目前, 如果我猜对了,解析器 简单地忽略所有文本(标签或no 标记),除非它是带有 runat=server属性或" <% " <!– #include 此外,由于ASP。NET被设计成 允许网页设计师的分离 (foo.aspx) (foo.aspx.vb),网页设计师可以 使用自己的网页设计工具 放置HTML和客户端JavaScript 而不需要知道ASP。网

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

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

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

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

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

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

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

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

相关:带有一些. net历史的来自登记册的文章

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

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

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

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

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

runat="Server"表示HTML“控件”将回发到服务器。

Web表单经常使用postback来通知服务器处理页面控制事件。

.NET MVC页面不使用postback(表单"submit"除外)。MVC依赖于JQUERY在客户端管理页面(因此绕过了向服务器发送大量postback消息的需要)。

< p >: .NET Web表单…在页面标记中大量使用"runat"属性

.NET MVC很少在页面标记中使用"runat"属性。

希望这有助于澄清为什么runat是必要的…

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

微软Msdn文章被遗忘的控件:HTML服务器控件通过将文本框<input type="text">转换为<input type="text" id="Textbox1" runat="server">的例子解释了runat="server"的用法

这样做将使您可以编程访问HTML元素 在创建Web页面并将其发送到客户机之前的服务器。 HTML元素必须包含id属性。此属性用于 作为元素的标识,使您能够对元素进行编程 通过他们的特定id。除了这个属性,HTML元素 必须包含runat="server"。这将告诉处理服务器 标签是在服务器上处理的,不被认为是一个

简而言之,要启用对HTML元素的编程访问,可以在其中添加runat="server"

非常多余的属性,考虑到“asp”标记显然是一个asp元素,应该足以将其标识为服务器端可访问元素。

然而,在其他地方,它用来提升普通标记以用于代码背后。

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

任何带有runat=server的标签都被添加为Page中的服务器控件,而两者之间的任何html内容都被处理为LiteralControls,这些LiteralControls也被添加到Page控件集合中。