【发布时间】:2009-01-28 20:23:55
【问题描述】:
我在我的门户网站中严重依赖嵌套母版页,这导致 ASP.NET 为其创建的控件生成巨大的 ID 标记,例如: "ctl00_ctl00_MainBody_ctl00_lblDescription"
对于我创建的 lblDescription 标签。
有什么办法可以减少这种混乱吗?
除了删除视图状态之外,还有什么其他技术(抱歉笼统)来减少页面重量?
【问题讨论】:
标签: asp.net optimization seo
我在我的门户网站中严重依赖嵌套母版页,这导致 ASP.NET 为其创建的控件生成巨大的 ID 标记,例如: "ctl00_ctl00_MainBody_ctl00_lblDescription"
对于我创建的 lblDescription 标签。
有什么办法可以减少这种混乱吗?
除了删除视图状态之外,还有什么其他技术(抱歉笼统)来减少页面重量?
【问题讨论】:
标签: asp.net optimization seo
【讨论】:
尽可能使用 HTML 控件。 HTML 控件。它们更轻,因为没有服务器端对象,除非您指定 runat="server" 属性。
【讨论】:
我不知道如何消除客户端 ID 膨胀,但一些缩小页面的一般技巧是:
【讨论】:
【讨论】:
Terrapin 有一些很棒的建议,但它们非常理想化。如果您正在寻找更适用于您当前情况的解决方案,请查看控制适配器。
CSS Friendly 适配器将帮助您将 ASP.NET 控件从大而难看的长 id 命名表转换为更简洁、名称更短的 div。
我过去曾使用过它们,它们确实可以产生巨大的影响。除此之外,在任何不需要它的控件上关闭视图状态。符合正确的 CSS/HTML 会产生另一个显着差异。
祝你好运!
【讨论】:
要最小化 ASP.NET 页面的重量,您还可以使用 SessionPageStatePersister 覆盖(Page 类的)PageStatePersister 属性。请参阅示例 here。这样,Viewstate 将保存在服务器端的 Session 对象中,从而减小了客户端 html 页面的大小。
【讨论】:
特别是在中继器、ListViews 和 GridViews 中,将您的控件命名为简短的名称。
这在上下文(产品列表)中应该很明显
如果中继器中只有一个超链接,请将其命名为 hl。您无需调用这些控件 HyperLinkProduct。
<asp:Repeater id="rptProducts" runat="server">
<ItemTemplate>
<asp:HyperLink id="hl" runat="server" NavigateUrl='<%# Eval("URL") %>'>
<%# Eval("Name") %>
</asp:HyperLink>
<asp:Image id="img" runat="server" ImageUrl='<%# Eval("ImageUrl") %>' />
</ItemTemplate>
</asp:Repeater>
这将呈现如下内容:
<a id="ctl00_rptProducts_ctrl0_hl" href="/products.aspx?id=5">
Product Name
</a>
<img id="ctl00_rptProducts_ctrl0_img" src="images/5.png"/>
将这些 ID 名称乘以 100,如果您使用长描述性名称,您的 ID 开始占用更多空间。在中继器内部,如果您的中继器命名良好,短 ID 应该足够清晰。
【讨论】:
使用CSS Sprites 可以通过减少请求数量来加速您的页面。这里是a fewarticlesI found.
【讨论】:
在您使用标签的情况下,请确保您确实需要使用标签(它会在 <span> 标记中生成文本。您可以改用 Literal。
在不需要的控件上设置EnableViewState="False"(或在整个页面/网站上)
如果您尝试更改由 ASP.NET 生成的晦涩的 ID,那么您无能为力。
【讨论】:
使用 html/css 设置页面样式,避免使用表格进行布局,创建标签时指定 id,越短越好。
【讨论】:
正如您所提到的,关闭视图状态很好。此外,我注意到 ASP.NET 树控件会生成大量 HTML(如果您有相当数量的节点)。我最终编写了自己的树控件,它生成标准树控件的 1/4 的 HTML。因此,您可以寻找这样的控件,尤其是糟糕的控件,然后编写自己的控件。
【讨论】:
我想如果你不顾一切地在不重新调整页面的情况下这样做(并且其他明智的想法都不起作用;)),你可以这样做:
编写一个 http 模块,在页面发送到客户端时动态解析和提取具有较短、可识别的唯一 ID 的 ID,并将它们存储在应用程序范围的哈希表中。然后,在回程中对传入的数据执行相反的步骤。
至少,这是我会尝试的。我不确定它与某些 html 和/或 javascript 结构的播放效果如何,但我认为可以做到。 我怀疑这样做会很痛苦,特别是如果较短的唯一 ID 碰巧与任何合法的非 ID 值发生冲突。
编辑:刚刚记得。你也需要处理 ViewState ......(这需要被解码、修复和重新编码。看起来很麻烦 :) 但是话又说回来,如果你要遇到那个麻烦,你通过覆盖加载/保存视图状态方法可以更好地压缩视图状态... 几年前,我使用这种方法将一些大页面(200K 的 html)减少到大约 30K。事实上,在 ViewState 上使用自定义压缩通常足以大幅减小页面大小。
【讨论】: