当我在ASP.NET控件上指定“runat =“server””属性时,这是一个强制性的属性,而且在我有限的ASP.NET知识中,“server”是唯一可用的选项,如果我不使用它会出错,为什么要这样做呢?
我知道在HTML标记上可以选择性地使用它,我也知道客户端/服务器范例以及它实际指定的内容。
这个属性是否是多余的,可以通过控件本身是ASP.NET控件来隐含,还是有潜在的原因?
当我在ASP.NET控件上指定“runat =“server””属性时,这是一个强制性的属性,而且在我有限的ASP.NET知识中,“server”是唯一可用的选项,如果我不使用它会出错,为什么要这样做呢?
我知道在HTML标记上可以选择性地使用它,我也知道客户端/服务器范例以及它实际指定的内容。
这个属性是否是多余的,可以通过控件本身是ASP.NET控件来隐含,还是有潜在的原因?
runat="server"
。保留标记不会有任何影响,将其删除会导致编译器错误。对于想学习网页语言的新手程序员来说,暗示的东西越多,学习就越困难。这是详细说明标记属性的充分理由。然后是这样的:[...]但
<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特定的标签或属性。我通常不喜欢猜测,但这一次我要猜一下...
如果你还记得微软在过去(2001年?)关于.NET的营销炒作,那么很难确定.NET到底是什么。它是一个服务器吗?编程平台?语言?还是全新的东西?根据广告,它可以是你想要的任何东西——它只是解决你可能遇到的任何问题。
所以,我的猜想是有一个隐藏的宏伟愿景,即ASP.NET代码可以在任何地方运行——服务器端或客户端,在与.NET运行时绑定的Internet Explorer副本中。runat="server"只是一个残留的痕迹,因为它的客户端等效部分从未进入生产。
还记得那些奇怪的广告吗?
并非所有可以包含在页面中的控件必须在服务器上运行。例如:
<INPUT type="submit" runat=server />
这基本上与以下内容相同:
<asp:Button runat=server />
从第一个标签中删除runat = server标记,您将获得在浏览器中运行的标准HTML按钮。关于在服务器上运行特定控件的理由利弊各有千秋,并且ASP.NET无法根据您包含的HTML标记“假定”您想要什么。可能可以为<asp:XXX />
控件系列“推断”runat = server,但我猜Microsoft会认为这是对标记语法和ASP.NET引擎的篡改。
微软 MSDN 文章 《遗忘的控件:HTML 服务器控件》 解释了如何使用带有一个文本框 <input type="text">
的示例来演示在 HTML 元素上添加 runat="server"
。
这样做将使您在 Web 页面创建并发送到客户端之前,在服务器上对 HTML 元素进行编程访问。HTML 元素必须包含一个 id 属性,该属性用于标识元素,并使您可以按其特定 ID 编程到元素。除此属性外,HTML 元素还必须包含 runat="server"。这告诉处理服务器,该标签在服务器上处理,不应视为传统的 HTML 元素。
简而言之,要实现程序化访问 HTML 元素,请将 runat="server"
添加到它。
ASP.NET文件中的HTML元素默认被视为文本。要使这些元素可编程,需要在HTML元素中添加runat="server"
属性。此属性表示该元素应被视为服务器控件。
这是因为在ASP .NET中,所有控件都继承自System.Web.UI.Control,该控件具有“runat”属性。
在System.Web.UI.HTMLControl类中,该属性不是必需的,但在System.Web.UI.WebControl类中,该属性是必需的。
编辑: 让我更具体一些。由于asp.net基本上是HTML的抽象,编译器需要某种指令,以便它知道特定的标记需要在服务器端运行。如果没有该属性,则不会知道首先在服务器上处理它。如果没有它,它会假设它是常规标记,并将其传递给客户端。
我认为微软可以通过让编译器在编译页面之前添加runat属性来解决这种歧义,就像Java中的泛型擦除一样,它可以在看到asp:标签前缀时写入runat=server,而不是擦除,这样开发人员就不需要担心了。
Web.config
中添加一种“默认属性”配置选项,可以基于前缀或名称,这可能是一个合适的解决方法。在解析过程中,必要时可以将默认属性注入到 DOM 中。我会尝试实现这个想法... - Dan Lugg