正如标题所说..为什么?
我知道为什么它需要在普通的 ASP.NET 控件上,关于这个有很多问题。
但是既然你只能在皮肤文件中定义 .NET 控件(没有普通的 HTML 标记),为什么皮肤文件中的runat="server"
每个控件仍然需要呢?
它与样式或主题无关。为什么我仍然需要将其添加到我的皮肤文件中的所有控件中?有谁知道“幕后”会发生什么?
正如标题所说..为什么?
我知道为什么它需要在普通的 ASP.NET 控件上,关于这个有很多问题。
但是既然你只能在皮肤文件中定义 .NET 控件(没有普通的 HTML 标记),为什么皮肤文件中的runat="server"
每个控件仍然需要呢?
它与样式或主题无关。为什么我仍然需要将其添加到我的皮肤文件中的所有控件中?有谁知道“幕后”会发生什么?
同样,您必须了解服务器端语言的工作原理。
在呈现页面之前,服务器端预处理器会将所有 ASP.NET 标记转换为浏览器可理解的 HTML(例如,浏览器不知道 <asp:button> 是什么)。这意味着由 ASP.NET 提供的所有控件/模块/任何东西(不仅仅是 HTML)都需要具有这些属性。
我敢说,预处理器最初是为了知道它需要根据该属性的存在而进行操作的。否则,即使它什么也没做,它也必须处理每个标签。它本来可以写成只查找名称空间,但这需要额外的处理。
皮肤文件是一个特殊的 ASP.NET 概念,用于框架内定义的标记。因此,这些标签必须具有“runat=server”是有道理的。MS 可以在他们的预处理器中写入一个特殊的规则,例如“如果它是一个皮肤文件,假设它都是 ASP 标签”......但这样的规则真的不能扩展。另外,它们是糟糕的文档。
作为 Web 开发人员,您应该了解哪些标签实际上是 HTML,哪些是框架提供的便利标签。该"runat=server"
属性使该描述明确。
您可以将 runat="server" 添加到纯 HTML 标记(例如 <input>),但通常没有什么理由这样做,而且这是一种不好的做法。
为了提高可移植性,您可能需要考虑放弃皮肤文件并利用 CSS。属性对于设置样式非常冗长,这使得最终呈现的页面更大(加载时间更长,提供较差的用户体验)并且没有语义。