为什么皮肤文件中的控件需要runat ="server"?

Eri*_*ker 3 asp.net markup skins themes runatserver

就像标题所说..为什么?

我知道为什么在正常的ASP.NET控件上需要它,关于这个问题有很多问题.

但由于您只能在外观文件中定义.NET控件(没有普通的HTML标记),为什么皮肤文件runat="server"中的每个控件仍然需要它?

它与样式或主题无关.有什么理由我仍然需要将它添加到我的皮肤文件中的所有控件?有谁知道它在幕后会发生什么?

Vis*_*ons 6

同样,您必须了解服务器端语言的工作原理.

在呈现页面之前,服务器端预处理器将所有ASP.NET标记转换为浏览器可理解的HTML(例如,浏览器不具有<asp:button>的概念).这意味着ASP.NET提供的所有控件/模块/任何不仅仅是HTML的东西都需要具有这些属性.

我冒昧地说,预处理器最初是根据该属性的存在而知道它需要操作的.否则,即使它什么也没做,它也必须处理每个标签.它可能只是为了寻找命名空间而编写,但这需要额外的处理.

一个皮肤文件是一种特殊的ASP.NET的理念,为框架内定义的标签.因此,这些标签必须具有"runat = server"才有意义.MS可以在他们的预处理器中编写一个特殊规则,例如"如果它是一个皮肤文件,假设它是所有ASP标签"......但是这样的规则实际上不能扩展.另外,他们是糟糕的文件.

作为Web开发人员,您应该了解哪些标记实际上是HTML,哪些是框架提供的便利标记.该"runat=server"属性使该描述显式化.

你可以将runat ="server"添加到纯HTML标签,例如<input>,但通常没有什么理由,这是一个不好的做法.

为了实现可移植性,您可能需要考虑远离皮肤文件并利用CSS.设置样式的属性非常冗长,这使得最终呈现的页面更大(加载时间更长,提供差的用户体验)和非语义.