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


205

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

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

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


2
我同意这个问题,需要澄清一点,“ asp:”(以及您在标头中指定的其他标签)不足以进行解析吗?还是在将控件转换为INPUT之后将符点命中,从而无法与其他HTML区分?我想,而它仍然在服务器控件形式RUNAT将被打...
异常结束

1
也许可以在上添加某种“ 默认属性 ”配置选项(可以是基于前缀或基于名称的配置)Web.config。在解析过程中,如有必要,可以将默认属性注入DOM。我要玩这个主意...
丹·拉格2012年

Answers:


112

我一直认为,您可以将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。特定标签或属性。


59
无论出于何种原因,当它可以安全地用作默认值时,仍然必须为每个<asp:>标记键入它的PITA。
belugabob

33

我通常不喜欢猜测,但是我将继续讨论这个……

如果您还记得微软在2001年曾经大肆宣传.NET的营销方式,那么很难说出.NET到底是什么。是服务器吗?一个编程平台?一种语言?完全新的东西?有了广告,它就可以说是您想要的任何东西,它可以解决您可能遇到的任何问题。

因此,我猜想有一个隐藏的宏伟愿景,那就是ASP.NET代码可以在与.NET运行时绑定的Internet Explorer副本中的任何位置(服务器端或客户端)运行。runat =“ server”只是残留的痕迹,被遗弃了,因为它与客户端等效,因此从未投入生产。

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

相关:The Register中的文章具有一些.NET历史。


5
您是否碰巧链接到包含任何“怪异广告”的网站?
RandomWebGuy 2011年

是的,我确实记得这些奇怪的广告。叹息
catfood

13

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

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

这基本上与以下内容相同:

<asp:Button runat=server />

从第一个标记中删除runat = server标记,您将在浏览器中运行一个标准HTML按钮。有一些理由支持和反对在服务器上运行特定控件,并且ASP.NET无法基于所包含的HTML标记来“假设”您想要的内容。可能可以“推断” <asp:XXX />控件家族的runat = server ,但是我的猜测是Microsoft会认为标记语法和ASP.NET引擎是黑客。


2
如果控件正在服务器上运行,这是否意味着您无法使用Javascript选择元素?例如document.getElementsById(“ tvns:treeview”);
Ciaran Gallagher

3
该元素仍将位于客户端的DOM中,因此仍然可以使用javascript / jQuery对其进行修改。但是,使用服务器呈现的元素可能会很棘手,尤其是对于动态控件。
Dave Swersky 2013年

8

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"


2
没有解决这个问题,它询问为什么在ASP.NET标记上必须运行runat =“ server”。
nhahtdh

3
@nhahtdh答案是:“启用对HTML元素的编程访问”。:)
开发人员MariusŽilėnas17年

2
OP知道标签的含义和作用。问题是在语言设计方面提出的问题-是什么使设计人员决定,甚至ASP.NET标记也需要标记为runat =“ server”才能在服务器端运行。
nhahtdh

@nhahtdh你的答案是什么?
开发人员MariusŽilėnas17年

2
我没有答案,但是最上面的答案解决了这个问题(是否正确)。您的答案没有,这就是我发表评论的原因。
nhahtdh

3

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


2

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


1

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

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

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


3
您的答案就是重新制定的问题。
Pablo Fernandez,

2
我的回答只是说明runat属性由于继承而存在。抱歉,我不清楚。
Russ Bradberry

3
恐怕我的问题太高了,我的问题是关于为什么它首先出现在堆栈中。无论如何
约翰·约翰逊

2
再次,没有真正回答这个问题,但我看到你正在试图说些什么
johnc

1

我认为Microsoft可以通过在页面进行编译之前使编译器添加runat属性来解决此歧义,例如Java使用泛型进行类型擦除的东西,而不是擦除,它可以在任何看到的地方编写runat = server asp:标签的前缀,因此开发人员无需担心。


1

如果在普通的html标签上使用它,则意味着您可以在事件处理程序等中以编程方式对其进行操作,例如,在页面加载时更改href标签或锚标签的类...仅在必要时这样做,因为香草html标签走得更快。

就用户控件和服务器控件而言,不,没有它们,它们就无法工作,没有深入研究aspx预处理器的内部,无法确切说明原因,但可以猜测,出于可能是很好的原因,他们只是写了这样的解析器,查找明确标记为“做某事”的事物。

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


0

在将数据提交到ASP.NET Web服务器时,在Runtime =“ server”中提到的控件将在Server Application中表示为Dot Net对象。您可以在HTML控件中手动键入代码,也可以通过在设计视图中右键单击来使用“运行服务器”选项。一旦从通常不包含HTML控件的工具箱中拖动属性,ASP.NET控件将自动获得该属性。


0

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

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


0

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


-5

runat="Server" 表示HTML“控件”将发生向服务器的回发。

Web窗体postback经常使用信号来指示服务器处理页面控制事件。

.NET MVC请勿使用页面postback(表单除外"submit")。 MVC依靠在JQUERY客户端上管理页面(从而避免了很多postback向服务器发送消息的需要)。

因此: .NETWeb表单... "runat"在页面标记中经常使用属性。

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

希望这有助于阐明为什么runat有必要...


1
-1不正确的事实,不能回答问题。
Cristian Diaconescu 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.