【问题标题】:Why does ASP.NET webforms need the Runat="Server" attribute?为什么 ASP.NET 网络表单需要 Runat="Server" 属性?
【发布时间】:2010-09-23 04:31:27
【问题描述】:

为什么我必须在我的所有 ASP.NET 控件上指定runat="server",当它是一个强制属性时,server 是我对 ASP.NET 知识有限的唯一可用选项,如果我得到一个错误不用吗?

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

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

【问题讨论】:

  • 我同意这个问题,澄清一下,'asp:'(以及您在标题中指定的其他标签)是否足以解析?还是在控件转换为 INPUT 后 runat 被击中,从而与其他 HTML 无法区分?我认为 runat 仍处于服务器控制形式时会被击中...
  • 或许在Web.config 中添加一种“默认属性”配置选项(可以是前缀或基于名称)是一种合适的解决方法。在解析过程中,可以在必要时将默认属性注入 DOM。我会玩这个想法......

标签: asp.net runatserver


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

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

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

          【讨论】:

          • 没有解决问题,即为什么 runat="server" 在 ASP.NET 标签上是强制性的。
          • @nhahtdh 答案是:“启用对 HTML 元素的编程访问”。 :)
          • OP 知道标签的含义和作用。问题是在语言设计方面提出的问题 - 是什么让设计人员决定即使是 ASP.NET 标记也需要用 runat="server" 标记才能在服务器端运行。
          • @nhahtdh 你的答案是什么?
          • 我没有答案,但最重要的答案解决了这个问题(正确与否)。你的回答没有,这就是我发表评论的原因。
          【解决方案6】:

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

          Web 窗体使用postback 不断地向服务器发出信号以处理页面控制事件。

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

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

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

          希望这有助于澄清为什么需要runat...

          【讨论】:

          • -1 不准确的事实,不回答问题。
          【解决方案7】:

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

          【讨论】:

            【解决方案8】:

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

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

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

            【讨论】:

              【解决方案9】:

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

              【讨论】:

                【解决方案10】:

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

                此对话是在 Mike Schinkel 的Blog 上进行的,他本人与 Microsoft National Services 的 Talbot Crowell 之间进行。相关信息如下(第一段因原文语法错误而改写):

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

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

                继续:

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

                他继续说:

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

                【讨论】:

                • 不管是什么原因,当它可以安全地成为默认值时,仍然是一个 PITA 必须为每个 标签输入它。
                【解决方案11】:

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

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

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

                【讨论】:

                • 您的答案正是重新表述的问题。
                • 我的回答只是说明 runat 属性是由于继承而存在的。我很抱歉没有说清楚。
                • 在堆栈中有点太高了,我担心,我的问题是关于为什么它首先存在。还是谢谢
                • 再说一次,不是真的回答这个问题,但我明白你想说什么
                【解决方案12】:

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

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

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

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

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

                【讨论】:

                • 您是否碰巧有一个链接到一个包含任何“奇怪广告”的网站?
                • 是的,我确实记得那些奇怪的广告。 叹息
                【解决方案13】:

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

                【讨论】:

                  【解决方案14】:

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

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

                  这与以下内容基本相同:

                  <asp:Button runat=server />

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

                  【讨论】:

                  • 如果一个控件正在服务器上运行,这是否意味着您不能使用 Javascript 选择元素?例如document.getElementsById("tvns:treeview");
                  • 该元素仍将在客户端的 DOM 中,因此仍然可以使用 javascript/jQuery 对其进行修改。然而,使用服务器渲染的元素可能会很棘手,尤其是使用动态控件。
                  猜你喜欢
                  • 2010-11-11
                  • 2013-05-20
                  • 2012-06-25
                  • 1970-01-01
                  • 1970-01-01
                  • 2019-06-11
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多