首页 文章

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

提问于
浏览
200

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

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

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

13 回答

  • 0

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

  • -4

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

  • 8

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

    执行此操作将使您在创建网页并将其发送到客户端之前以编程方式访问服务器上的HTML元素 . HTML元素必须包含id属性 . 此属性用作元素的标识,使您可以按特定ID对元素进行编程 . 除此属性外,HTML元素还必须包含runat =“server” . 这告诉处理服务器标签在服务器上处理,不被视为传统的HTML元素 .

    In short, to enable programmatic access to the HTML element add runat="server" to it.

  • 1

    我一直认为,除了理解你可以混合使用ASP.NET标签和HTML标签之外,HTML标签可以选择是否为 runat="server" . 它没有任何关于标签属性的详细信息 .

    迈克·辛克尔在他自己和微软国家服务公司的塔尔博特·克罗威尔之间进行了这次谈话 . 相关信息如下(第一段由于语法错误而被解释):

    [...]但<runat =“server”>的重要性更多是为了一致性和可扩展性 . 如果开发人员必须为ASP.NET引擎标记某些标记(即<asp:/>)而忽略,那么标记之间的命名空间冲突和未来增强也可能存在问题 . 通过要求<runat =“server”>属性,这被否定 .

    它继续:

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

    他继续:

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

  • 3

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

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

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

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

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

  • 108

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

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

    这基本上与以下相同:

    <asp:Button runat=server />

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

  • 1

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

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

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

  • 13

    我认为微软可以通过在编译页面之前使编译器添加runat属性来解决这种不确定性,类似于java与泛型的类型擦除,而不是擦除,它可能在任何地方编写runat = server asp:标签的前缀,因此开发人员不必担心它 .

  • 2

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

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

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

  • 1

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

  • 0

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

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

  • 33

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

  • 0

    runat="Server" 表示HTML将发生对服务器的回发"control."

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

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

    所以: .NET Web窗体...在页面标记中使用了 "runat" 属性 .

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

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

相关问题