208

为什么我必须runat="server"在我的所有 ASP.NET 控件上指定它是一个强制属性,并且server是我对 ASP.NET 的有限知识中唯一可用的选项,并且如果我不使用它会出现错误?

我确实知道我可以选择在我的 HTML 标记上使用它,并且我确实了解客户端/服务器范例及其实际指定的内容。

它是作为 ASP.NET 控件的控件可能只是暗示的冗余标记,还是有潜在的原因?

4

14 回答 14

113

我一直认为,您可以混合使用 ASP.NET 标记和 HTML 标记,而 HTML 标记可以选择存在runat="server"或不存在。将标签留在其中并不会造成任何伤害,并且会导致编译器错误将其取出。你对 Web 语言的暗示越多,一个初露头角的程序员就越不容易进入并学习它。这与任何关于标签属性的详细理由一样好。

这段对话是在 Mike Schinkel 的博客上,他和 Microsoft National Services 的 Talbot Crowell 之间进行的。相关信息如下(由于来源中的语法错误而改写了第一段):

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

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

它继续:

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

他继续:

目前,如果我的猜测是正确的,解析器会简单地忽略所有文本(标签或无标签),除非它是带有 runat=server属性或“<code><%”前缀或 ssi “<code><!– #include... (...) 此外,由于 ASP.NET 的设计允许将 Web 设计者 (foo.aspx) 与 Web 开发者 (foo.aspx.vb) 分开,因此 Web 设计者可以使用他们自己的 Web 设计器工具来放置 HTML和客户端 JavaScript,而无需了解 ASP.NET 特定标签或属性。

于 2008-11-20T04:14:21.990 回答
33

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

如果您还记得当时(2001 年?)微软对 .NET 的营销炒作,就很难说 .NET 到底是什么了。是服务器吗?编程平台?一种语言?全新的东西?考虑到广告,它是您想要的任何模棱两可的东西 - 它只是解决了您可能遇到的任何问题。

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

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

相关:来自 The Register 的文章,其中包含一些 .NET 历史。

于 2008-11-20T04:21:39.730 回答
13

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

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

这与以下内容基本相同:

<asp:Button runat=server />

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

于 2008-11-20T04:14:02.553 回答
9

Microsoft Msdn 文章The Forgotten Controls: HTML Server Controls通过文本框的示例解释了 runat="server" 的使用<input type="text">,将其转换为<input type="text" id="Textbox1" runat="server">

这样做将使您在创建网页并将其发送到客户端之前以编程方式访问服务器上的 HTML 元素。HTML 元素必须包含一个 id 属性。此属性用作元素的标识,使您能够通过元素的特定 ID 对元素进行编程。除此属性外,HTML 元素还必须包含 runat="server"。这告诉处理服务器该标签是在服务器上处理的,不应被视为传统的 HTML 元素。

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

于 2016-04-05T05:54:12.683 回答
3

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

于 2008-11-20T04:16:04.920 回答
2

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

于 2015-04-02T07:34:12.287 回答
1

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

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

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

于 2008-11-20T04:17:43.000 回答
1

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

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

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

于 2008-12-22T19:30:22.313 回答
1

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

于 2011-11-19T23:37:51.173 回答
0

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

于 2013-01-27T18:16:07.513 回答
0

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

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

于 2017-09-01T08:11:19.683 回答
0

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

于 2017-12-30T15:17:28.660 回答
0

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

于 2020-08-02T17:37:53.040 回答
-5

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

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

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

所以: .NETWeb 表单..."runat"在页面标记中大量使用属性。

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

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

于 2014-03-01T20:02:14.327 回答