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

时间:2008-11-20 03:58:01

标签: asp.net runatserver

为什么我必须在所有ASP.NET控件上指定runat="server"作为必需属性,server是我对ASP.NET知识有限的唯一选项,我得到了如果我不使用它会出错?

我明白我可以选择在我的HTML标签上使用它,并且我理解客户端/服务器范例及其实际指定的内容。

它是一个冗余标记,可能只是由控件作为ASP.NET控件隐含,还是有潜在原因?

14 个答案:

答案 0 :(得分:108)

我一直认为,除了理解你可以混合使用ASP.NET标签和HTML标签之外,还有HTML标签可以选择是否runat="server"。保留标签不会造成任何损害,并且会导致编译器错误将其取出。你对Web语言的暗示越多,新手程序员进入和学习它就越不容易。对于标签属性来说,这是一个很好的理由。

Mike Schinkel在他自己和微软国民服务局的Talbot Crowell之间的Blog进行了这次对话。相关信息如下(第一段由于语法错误而被解释):

  

[...] <runat="server">的重要性更多是为了一致性和可扩展性。

     

如果开发人员必须标记某些标记(即<asp: />)以使ASP.NET引擎无法忽略,那么标记之间的命名空间冲突和未来增强也可能存在问题。通过要求<runat="server">属性,这被否定了。

它继续:

  

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

他继续说道:

  

目前,   如果我的猜测是正确的,解析器   只是忽略所有文本(标签或否   标签)除非它是一个标签   runat=server属性或“<%”   前缀或ssi“<!– #include ... (...)   此外,自ASP.NET旨在   允许网页设计师分离   (foo.aspx)来自网络开发者   (foo.aspx.vb),网页设计师可以   使用自己的网页设计工具   放置HTML和客户端JavaScript   无需了解ASP.NET   特定标签或属性。

答案 1 :(得分:33)

我通常不喜欢猜测,但我会选择这个......

如果你还记得当天(2001年?)的微软.NET营销炒作,那么很难说出.NET甚至是什么。它是服务器吗?一个编程平台?一种语言?什么新东西完全?鉴于这些广告,它的含糊不清是你想要的 - 它只是解决了你可能遇到的任何问题。

所以,我的猜测是,ASP.NET代码可以在任何地方运行隐藏的宏观愿景 - 服务器端或客户端,在与.NET运行时绑定的Internet Explorer副本中。 runat =“server”只是一个残留的遗留物,因为它的客户端等价物从未投入生产。

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

相关:Article from The Register包含一些.NET历史记录。

答案 2 :(得分:13)

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

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

这基本上与:

相同

<asp:Button runat=server />

从第一个中删除runat = server标记,并且您有一个在浏览器中运行的标准HTML按钮。有理由支持和反对在服务器上运行特定控件,并且ASP.NET无法根据您包含的HTML标记“假设”您想要的内容。有可能“推断”<asp:XXX />控件系列的runat = server,但我的猜测是微软会认为这是对标记语法和ASP.NET引擎的破解。

答案 3 :(得分:8)

Microsoft Msdn文章The Forgotten Controls: HTML Server Controls解释了如何使用runat =&#34; server&#34;通过将文本框转换为<input type="text">

,在文本框<input type="text" id="Textbox1" runat="server">上添加示例
  

执行此操作将为您提供对HTML元素的编程访问   创建网页之前的服务器并将其发送到客户端。   HTML元素必须包含id属性。此属性用于   作为元素的标识,使您可以编程元素   按他们的具体ID。除了这个属性,HTML元素   必须包含runat =&#34; server&#34;。这告诉处理服务器    标签在服务器上处理,不被视为a   传统的HTML元素。

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

答案 4 :(得分:3)

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

答案 5 :(得分:2)

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

答案 6 :(得分:1)

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

就用户控件和服务器控件而言,不,它们只是没有它们就不会工作,没有深入研究aspx预处理器的内部,不能确切地说出原因,但是可能会猜测这可能是有充分理由的,他们只是用这种方式编写解析器,寻找明确标记为“做某事”的事情。

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

答案 7 :(得分:1)

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

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

修改 让我更具体一点。因为asp.net几乎是HTML的摘要,所以编译器需要某种指令,以便它知道特定标记需要在服务器端运行。如果那个属性不在那里,那么就不会知道在服务器上首先处理它。如果不存在则假定它是常规标记并将其传递给客户端。

答案 8 :(得分:1)

我认为微软可以通过在编译页面之前使编译器添加runat属性来修复这种歧义,类似于java与泛型的类型擦除,而不是擦除,它可能是写runat = server无论它在哪里看到asp:标签的前缀,所以开发人员都不需要担心它。

答案 9 :(得分:0)

将数据提交到ASP.NET Web服务器时,提到的Runat =“server”控件将在Server Application中表示为Dot Net对象。您可以在HTML控件中手动键入代码,也可以通过右键单击设计视图来使用运行方式服务器选项。 一旦从工具箱拖动它,ASP.NET控件就会自动获取此属性,通常HTML控件不会。

答案 10 :(得分:0)

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

然而,在其他地方,它用于提升在代码隐藏中使用的普通标签。

答案 11 :(得分:0)

我刚刚通过反复试验得出这个结论: RUNAT =&#34;服务器&#34;需要在服务器端运行时访问元素。 删除它们,重新编译并观察会发生什么。

答案 12 :(得分:0)

任何带有runat = server的标记都被添加为Page中的服务器控件,并且它们之间的所有html内容都作为LiteralControls处理,也被添加到Page控件集合中。

答案 13 :(得分:-5)

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

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

.NET MVC页面请勿使用postback(表单"submit"除外)。 MVC依赖于JQUERY来管理客户端上的页面(从而绕过了对服务器的大量postback消息的需求。)

所以: .NET Web表单...在页面标记中使用"runat"属性。

.NET MVC几乎没有在页面标记中使用"runat"属性。

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