为什么我必须runat="server"
在所有ASP.NET控件上指定它为强制属性,并且server
是我有限的ASP.NET知识中唯一可用的选项,并且如果不使用它,则会出现错误?
我确实知道我可以选择在HTML标记上使用它,并且我确实了解客户端/服务器范例及其实际指定的内容。
它是ASP.NET控件可能只是暗示的冗余标记,还是有潜在的原因?
Web.config
。在解析过程中,如有必要,可以将默认属性注入DOM。我要玩这个主意...
为什么我必须runat="server"
在所有ASP.NET控件上指定它为强制属性,并且server
是我有限的ASP.NET知识中唯一可用的选项,并且如果不使用它,则会出现错误?
我确实知道我可以选择在HTML标记上使用它,并且我确实了解客户端/服务器范例及其实际指定的内容。
它是ASP.NET控件可能只是暗示的冗余标记,还是有潜在的原因?
Web.config
。在解析过程中,如有必要,可以将默认属性注入DOM。我要玩这个主意...
Answers:
我一直认为,您可以将ASP.NET标记和HTML标记混合使用,并且HTML标记可以选择是否存在runat="server"
。将标记保留在其中不会造成任何伤害,并且会导致编译器错误将其取出。您对Web语言隐含的内容越多,对于一个崭露头角的程序员来说,学习它越不容易。就像任何关于标签属性的详细说明一样,这也是一个很好的理由。
他和Microsoft National Services的Talbot Crowell之间在Mike Schinkel的Blog中进行了交谈。相关信息如下(第一段因来源中的语法错误而表述):
[...]但
<runat="server">
对于一致性和可扩展性的重要性更大。如果开发人员必须标记一些标记(即
<asp: />
)以使ASP.NET Engine忽略,那么标记和将来的增强之间就存在名称空间冲突的潜在问题。通过要求<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。特定标签或属性。
我通常不喜欢猜测,但是我将继续讨论这个……
如果您还记得微软在2001年曾经大肆宣传.NET的营销方式,那么很难说出.NET到底是什么。是服务器吗?一个编程平台?一种语言?完全新的东西?有了广告,它就可以说是您想要的任何东西,它可以解决您可能遇到的任何问题。
因此,我猜想有一个隐藏的宏伟愿景,那就是ASP.NET代码可以在与.NET运行时绑定的Internet Explorer副本中的任何位置(服务器端或客户端)运行。runat =“ server”只是残留的痕迹,被遗弃了,因为它与客户端等效,因此从未投入生产。
还记得那些奇怪的广告吗?
相关:The Register中的文章具有一些.NET历史。
并非可以包含在页面中的所有控件都必须在服务器上运行。例如:
<INPUT type="submit" runat=server />
这基本上与以下内容相同:
<asp:Button runat=server />
从第一个标记中删除runat = server标记,您将在浏览器中运行一个标准HTML按钮。有一些理由支持和反对在服务器上运行特定控件,并且ASP.NET无法基于所包含的HTML标记来“假设”您想要的内容。可能可以“推断” <asp:XXX />
控件家族的runat = server ,但是我的猜测是Microsoft会认为标记语法和ASP.NET引擎是黑客。
Microsoft Msdn文章“被遗忘的控件:HTML服务器控件 ” <input type="text">
通过将runat =“ server” 转换为文本框上的示例,说明了如何使用runat =“ server”<input type="text" id="Textbox1" runat="server">
这样做将使您可以在创建网页并将其发送给客户端之前,以编程方式访问服务器上的HTML元素。HTML元素必须包含id属性。此属性用作元素的标识,并使您可以通过元素的特定ID对其进行编程。除了此属性之外,HTML元素还必须包含runat =“ server”。这告诉处理服务器该标记是在服务器上处理的,不应视为传统的HTML元素。
简而言之,要启用对HTML元素的编程访问,请添加该元素runat="server"
。
默认情况下,ASP.NET文件中的HTML元素被视为文本。要使这些元素可编程,请runat="server"
向HTML元素添加一个属性。此属性指示该元素应被视为服务器控件。
之所以在那里,是因为ASP .NET中的所有控件都继承自具有“ runat”属性的System.Web.UI.Control。
在System.Web.UI.HTMLControl类中,该属性不是必需的,但是,在System.Web.UI.WebControl类中,该属性是必需的。
编辑: 让我更具体。由于asp.net几乎是HTML的抽象,因此编译器需要某种指令,以便它知道特定标记需要在服务器端运行。如果该属性不存在,则将不知道首先在服务器上进行处理。如果不存在,则假定它是常规标记,并将其传递给客户端。
我只是通过反复试验得出这个结论:需要runat =“ server”在运行时在服务器端访问元素。删除它们,重新编译并观察会发生什么。
runat="Server"
表示HTML“控件”将发生向服务器的回发。
Web窗体postback
经常使用信号来指示服务器处理页面控制事件。
.NET
MVC
请勿使用页面postback
(表单除外"submit"
)。 MVC
依靠在JQUERY
客户端上管理页面(从而避免了很多postback
向服务器发送消息的需要)。
因此:
.NET
Web表单... "runat"
在页面标记中经常使用属性。
.NET
MVC
几乎不使用 "runat"
在页面标记中属性。
希望这有助于阐明为什么runat
有必要...