为什么ASP.NET webforms需要Runat =“Server”属性?

为什么我必须在所有ASP.NET控件上指定runat="server" ,这是必须的属性, server是ASP.NET有限知识中唯一可用的选项,如果我不知道用它?

我明白,我可以select使用它在我的HTML标签,我也明白客户端/服务器的范例,它实际上是指定。

这是一个多余的标签,可能只是由ASP.NET控件的控件隐含,或者是有一个潜在的原因?

我一直认为有更多的理解,你可以混合使用ASP.NET标签和HTML标签,HTML标签可以selectrunat="server" 。 它不会损害任何东西,将标签放入,并导致编译器错误将其取出。 对networking语言的暗示越多,新手程序员就越容易进入并学习它。 对于标签属性来说,这是一个很好的理由。

Mike Schinkel的博客介绍了他本人和微软全国服务的Talbot Crowell之间的对话。 相关信息如下(由于源语法错误而引起的第一段的解释):

但是<runat="server">对于一致性和可扩展性更重要。

如果开发人员必须标记一些标签(即<asp: /> )以使ASP.NET引擎忽略,那么标签之间的命名空间冲突以及将来的增强也是潜在的问题。 通过要求<runat="server">属性,这是否定的。

它继续:

如果所有客户端标签都需要<runat=client> ,parsing器将需要parsing所有的标签并<runat=client>部分。

他继续说道:

目前,如果我的猜测是正确的,parsing器只是忽略所有的文本(标签或没有标签),除非它是一个标签与runat=server属性或一个“ <% ”前缀或ssi“ <!– #include(.. 。)另外,由于ASP.NET允许从web开发者(foo.aspx.vb)中分离webdevise者(foo.aspx),所以webdevise者可以使用他们自己的webdevise者工具来放置HTML和客户端 -而不必了解ASP.NET特定的标签或属性。

我通常不喜欢猜测,但我要去看这个…

如果你还记得当天(2001年?)微软的.NET营销宣传,那很难说什么.NET。 是服务器吗? 一个编程平台? 一种语言? 新的东西完全是? 鉴于广告,这是模糊的任何你想要的 – 它只是解决了你可能有的任何问题。

所以,我的猜测是,有一个隐藏的macros伟蓝图,ASP.NET代码可以运行在任何地方 – 服务器端或客户端,在与.NET运行时绑定的Internet Explorer副本中。 runat =“server”只是一个退化的遗留物,留下来是因为它的客户端相当于从未投入生产。

记住那些奇怪的广告?

有关.NET历史的注册文章 。

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

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

这基本上是一样的:

<asp:Button runat=server />

从第一个移除runat = server标记,并且您有一个标准的HTMLbutton,在浏览器中运行。 有理由和反对在服务器上运行一个特定的控制,并且ASP.NET没有办法根据您包含的HTML标记“假设”您想要什么。 也许可以“推断” <asp:XXX />控件系列的runat = server,但是我的猜测是微软会考虑对标记语法和ASP.NET引擎进行破解。

Microsoft Msdn文章“被遗忘的控件:HTML服务器控件 ”通过将文本框转换为<input type="text" id="Textbox1" runat="server">来解释runat =“server” <input type="text" id="Textbox1" runat="server">

这样做将使您能够在创buildWeb页面之前以编程方式访问服务器上的HTML元素,并将其发送到客户端。 HTML元素必须包含一个id属性。 此属性用作元素的标识,并使您可以按元素的特定ID编程。 除了这个属性,HTML元素必须包含runat =“server”。 这告诉处理服务器该标签在服务器上被处理并且不被认为是传统的HTML元素。

简而言之,要启用对HTML元素的编程访问,请将runat="server"添加到它。

我怀疑是在处理过程中如何识别服务器端控件。 而不是必须在运行时按名称检查每个控件,以确定是否需要完成服务器端处理,而是通过标记对内部节点表示进行select。 编译器检查以确保所有需要服务器标签的控件在validation步骤中都有它们。

这是因为ASP.NET中的所有控件都inheritance自具有“runat”属性的System.Web.UI.Control。

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

编辑:让我更具体。 由于asp.net几乎是HTML的一个抽象,所以编译器需要某种指令,以便它知道特定的标记需要运行在服务器端。 如果那个属性不存在,那么就不知道在服务器上先处理它。 如果它不在那里,则认为它是正常的标记,并将其传递给客户端。

我认为微软可以通过在编译页面之前joinrunat属性来解决这个问题,比如java对generics的types擦除,而不是擦除,它可以在任何地方看到runat = server asp:标签的前缀,所以开发人员不需要担心它。

如果你在普通的html标签上使用它,这意味着你可以在事件处理程序中以编程方式处理它们,例如,在页面加载时更改锚点标签的href或class …只有当你必须这样做时,因为vanilla html标签走得更快

至于用户控件和服务器控件,不,他们只是不工作没有他们,没有深入到aspx预处理器的内部,不能说清楚为什么,但会猜测,可能是很好的原因,他们只是写这样的parsing器,寻找明确标记为“做某事”的事情。

如果@JonSkeet在任何地方,他可能会提供更好的答案。

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

将数据提交给ASP.NET Web服务器时,Runat =“server”中提到的控件将在Server Application中表示为Dot Net对象。 您可以在HTML控件中手动input代码,也可以在devise视图中右键单击Run As Server选项。 一旦从工具箱中拖拽它,ASP.NET控件就会自动获取这个属性。

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

但是,在其他地方,它用来提升普通标签以用于代码隐藏。

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

Web窗体不断使用postback来指示服务器处理页面控制事件。

.NET MVC页面不要使用postback (除了表单"submit" )。 MVC依靠JQUERY来pipe理客户端的页面(从而绕过了大量的postback发消息到服务器的需求)。

所以: .NET Web Forms …在页面标记中使用"runat"属性很多。

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

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