如何优化中继器白色空间

时间:2011-08-07 05:12:51

标签: c# asp.net repeater

在我的转发器中,我有以下标记:

    <asp:Repeater runat="server" id="TeamsRepeater" OnItemDataBound="TeamsRepeater_ItemDataBound" ClientIDMode="Predictable">
        <ItemTemplate>
            <tr runat="server" id="team">
                <td><%# Container.ItemIndex + 1 %></td>
                <td><%#Eval("PosChange")%></td>
                <th><%# ((ITeam)Eval("MemberTeam")).Href()%></th>
                <td><%#Eval("GamesAll")%></td>
                <td><%#Eval("GameW")%></td>
                <td><%#Eval("GameD")%></td>
                <td><%#Eval("GameL")%></td>
                <td><%#((ITournMember)Container.DataItem).Goals()%></td>
                <td><%#Eval("Score")%></td>
            </tr>
        </ItemTemplate>
    </asp:Repeater>

这是非常易读的(并且可以维护,如果你看到可以做得更好的话,请指出我。)

但我担心的是,为此标记生成的HTML代码包含大量空格......

我怎样才能按顺序加强:

  1. 从输出html中删除不必要的空格;
  2. 同时:保持标记可读性?

4 个答案:

答案 0 :(得分:3)

我不会牺牲可读性来摆脱空间。从长远来看,这会伤害到你。而是为您的动态内容启用压缩,即使用IIS HTTP Compression - 最终结果将是您的aspx页面上的动态gzip压缩,它比普通HTML小得多。

答案 1 :(得分:3)

你可以尝试这个HttpModule that removes whitespace

答案 2 :(得分:2)

创建模块效果很好,但是如果您使用的更新面板和AJAX不起作用,因为AJAX请求会被响应的大小处理。当响应更改时,AJAX javascript失败。因此,我创建了一个Repeater控件,在发送之前修剪其响应:

    <Assembly: TagPrefix("MyControls", "MyRepeater")> 
    ''' <summary>
    ''' Summary description for MyRepeater.
    ''' </summary>
    <ToolboxData("<{0}:MyRepeater runat=server></{0}:MyRepeater>")>
    Public Class MyRepeater : Inherits Repeater
        Protected Overrides Sub Render(writer As System.Web.UI.HtmlTextWriter)

        Using htmlwriter As New HtmlTextWriter(New System.IO.StringWriter())
           MyBase.Render(htmlwriter)
           Dim html As String = htmlwriter.InnerWriter.ToString()
           html = Regex.Replace(html, "(?<=[^])\t{2,}|(?<=[>])\s{2,}(?=[<])|(?<=[>])\s{2,11}(?=[<])|(?=[\n])\s{2,}", String.Empty)
           html = Regex.Replace(html, "[ \f\r\t\v]?([\n\xFE\xFF/{}[\];,<>*%&|^!~?:=])[\f\r\t\v]?", "$1")
           html = html.Replace(";\n", ";")
           writer.Write(html.Trim())
         End Using
      End Sub
   End Class

然后在您的aspx页面上输入此内容以注册控件

   <%@ Register TagPrefix="ccl"  Assembly="MyControls" Namespace="MyControls" %>        

答案 3 :(得分:0)

@Budda,可能是我的决定是愚蠢的,但它有效且可能是可读的:)

<table>
    <asp:Repeater ID="Repeater1" runat="server" DataSourceID="CustomersSource">
        <ItemTemplate><%# string.Format("<tr>{0}</tr>", 
                            string.Format("<td>{0}</td>", 
                                string.Join("</td><td>", 
                                    new[]
                                      {
                                        Eval("CustomerID"), 
                                        Eval("CompanyName")
                                      }))) %></ItemTemplate>
    </asp:Repeater>
</table>

如果将代码移动到辅助方法,我们将得到更优雅的决定:

public static class HtmlHelper
{
  public static string TableRow(params string[] tdList)
  {
    return string.Format("<tr>{0}</tr>", string.Format("<td>{0}</td>", string.Join("</td><td>", tdList)));
  }
}

<table>
    <asp:Repeater ID="Repeater1" runat="server" DataSourceID="CustomersSource">
        <ItemTemplate><%# HtmlHelper.TableRow(
                        Eval("CustomerID").ToString(), 
                        Eval("CompanyName").ToString()) %></ItemTemplate>
    </asp:Repeater>
</table>