Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么ASP.NET webforms需要Runat=";服务器";属性_Asp.net_Runatserver - Fatal编程技术网

为什么ASP.NET webforms需要Runat=";服务器";属性

为什么ASP.NET webforms需要Runat=";服务器";属性,asp.net,runatserver,Asp.net,Runatserver,为什么我必须在所有ASP.NET控件上指定runat=“server”,因为它是一个强制属性,并且server是我对ASP.NET有限的了解中唯一可用的选项,如果我不使用它,我会出错 我知道我可以选择在HTML标记上使用它,我也知道客户机/服务器模式以及它实际指定的内容 它是一个冗余标记,可能只是由ASP.NET控件暗示的,还是有根本原因?并非页面中可以包含的所有控件都必须在服务器上运行。例如: 这基本上与: 从第一个标签中删除runat=server标签,您就有了一个在浏览器中运行的标准H

为什么我必须在所有ASP.NET控件上指定
runat=“server”
,因为它是一个强制属性,并且
server
是我对ASP.NET有限的了解中唯一可用的选项,如果我不使用它,我会出错

我知道我可以选择在HTML标记上使用它,我也知道客户机/服务器模式以及它实际指定的内容


它是一个冗余标记,可能只是由ASP.NET控件暗示的,还是有根本原因?

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

这基本上与:


从第一个标签中删除runat=server标签,您就有了一个在浏览器中运行的标准HTML按钮。在服务器上运行特定控件有其原因,也有其原因,ASP.NET无法根据所包含的HTML标记“假定”所需内容。可以推断“RunAT=服务器”的代码< >代码>家族的控制,但我猜想微软会认为这是对标记语法和ASP.NET引擎的一种攻击。

< P>我一直认为,在了解ASP.NET标签和HTML标签的混合时,这是更重要的。HTML标记可以是
runat=“server”
,也可以不是。保留标记不会造成任何伤害,并且会导致编译器错误将其删除。您对web语言的暗示越多,对于一个初出茅庐的程序员来说,学习它就越不容易。这是详细说明标记属性的一个很好的理由

这段对话是在迈克·辛克尔和微软国家服务公司的塔尔博特·克罗威尔之间进行的。相关信息如下(第一段由于来源中的语法错误而被改写):

[…]但是
的重要性更在于一致性和可扩展性

如果开发人员必须为ASP.NET引擎标记一些要忽略的标记(即,
),那么还可能存在标记之间的命名空间冲突和未来的增强问题。通过要求
属性,这是否定的

它继续说:

如果所有客户端标记都需要
,解析器将需要解析所有标记并去掉
部分

他继续说:

目前,, 如果我的猜测是正确的,解析器 只需忽略所有文本(标记或否) 标签),除非它是带有
runat=server
属性或“
(…)
另外,由于ASP.NET设计用于
允许web设计器分离
(foo.aspx)来自web开发人员
(foo.aspx.vb),网页设计师可以
使用他们自己的web设计器工具
放置HTML和客户端JavaScript
不必了解ASP.NET
特定的标签或属性


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

如果您在普通html标记上使用它,这意味着您可以在事件处理程序中以编程方式对它们进行操作,例如在页面加载时更改href或锚定标记的类……只有在必要时才这样做,因为普通html标记速度更快

至于用户控件和服务器控件,不,没有它们,它们就无法工作,没有深入研究过aspx预处理器的内部,无法确切说明原因,但会猜测,出于可能的原因,它们只是以这种方式编写解析器,寻找显式标记为“do something”的内容


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

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

如果你还记得当年微软的.NET营销宣传(2001?),就很难说.NET到底是什么。它是一台服务器吗?一个编程平台吗?一种语言吗?一种全新的东西吗?考虑到这些广告,它几乎是你想要的任何东西——它只是解决了你可能遇到的任何问题

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

还记得那些奇怪的广告吗


相关:有一些.NET历史记录。

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

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

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

我认为微软可以通过让编译器在编译页面之前添加runat属性来解决这种歧义,就像java在泛型中使用的类型擦除功能,而不是擦除,它可以在看到标记的asp:前缀的任何地方编写runat=server,这样开发者就不必担心了。

n将数据提交到ASP.NET Web服务器中,在服务器应用程序中,作为Runat=“server”提到的控件将表示为Dot NET对象。您可以手动键入cod