2011-08-07 53 views
4

在我的中繼器,我有以下的標記:如何優化中繼器的空格

<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. 在同一時間:保持標記的可讀性?
+0

我知道這可能是醜陋的,但你可以做到這一點通過簡單的get {return propertyName.Trim();}你將不必犧牲你的標記可讀性 – Icarus

回答

3

我不會犧牲可讀性來擺脫空間。從長遠來看,這會傷害你。取而代之的是,爲動態內容啓用壓縮,即使用IIS HTTP Compression - 最終結果將是您的aspx頁面上的動態gzip壓縮比您的純HTML要小得多。

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> 
+0

可能是一個有趣的想法,但沒有......沒辦法。 – Budda

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" %>