2010-10-21 48 views
2

對於購物車頁面,項目列表顯示在html表格中。 我使用了ListView,它工作得很好。ListView - 在空數據源上顯示LayoutTemplate

當購物車爲空時,顯示文字「本購物車是空的」。但它只是在EmptyDataTemplate中呈現代碼。我的目標是顯示錶頭('刪除','產品','數量'等),而無需在EmptyDataTemplate中重複該HTML代碼。

試着很聰明,我將EmptyDataTemplate改成了EditItemTemplate,並使用下面顯示的代碼位。

任何人都可以想到一個更優雅的解決方案,這個問題?

[C#代碼]

lvShoppingCart.DataSource = _cart.Items; 
    lvShoppingCart.DataBind(); 


    if (_cart.ProductCount == 0) 
    { 
     lvShoppingCart.DataSource = new List<string>() { "dummy cart item" }; 
     lvShoppingCart.EditIndex = 0; 
     lvShoppingCart.DataBind(); 
    } 

[ASPX代碼]

<asp:ListView ID="lvShoppingCart" runat="server"> 
     <LayoutTemplate> 
      <table style="width: 600px;" border="0" cellspacing="0" cellpadding="0"> 
       <tr> 
        <td> 
         <table border="0" cellspacing="0" cellpadding="0"> 
          <tr> 
           <td width="50"> 
            <strong>Delete</strong> 
           </td> 
           <td width="400"> 
            <strong>Product</strong> 
           </td> 
           <td width="100"> 
            <strong>Quantity</strong> 
           </td> 
           <td width="100"> 
            <strong>Price</strong> 
           </td> 
           <td width="100"> 
            <strong>Total</strong> 
           </td> 
          </tr> 
         </table> 
         <hr /> 
        </td> 
       </tr> 
       <tr id="itemPlaceHolder" runat="server"> 
       </tr> 
       <tr id="trShoppingCartUpdateBtn" runat="server"> 
        <td> 
         <table width="100%" border="0" cellspacing="0" cellpadding="0"> 
          <tr> 
           <td width="50"> 
            &nbsp; 
           </td> 
           <td width="400"> 
            &nbsp; 
           </td> 
           <td colspan="3" width="300"> 
            <table border="0" cellspacing="0" cellpadding="0"> 
             <tr> 
              <td> 
               <asp:ImageButton ID="btnImgUpdateQuantities" ImageUrl="../img/refresh.gif" AlternateText="update shopping cart" 
                OnClick="btnUpdateQuantities_Click" runat="server" /> 
              </td> 
              <td> 
               <asp:LinkButton ID="btnUpdateQuantities" Text="update cart" OnClick="btnUpdateQuantities_Click" 
                runat="server" /> 
              </td> 
             </tr> 
            </table> 
           </td> 
          </tr> 
         </table> 
        </td> 
       </tr> 
       <tr id="trShoppingCartTotals" runat="server"> 
        <td> 
         <table width="100%" border="0" cellspacing="0" cellpadding="0"> 
          <tr> 
           <td colspan="4"> 
            <div align="right"> 
             <strong>Totals: </strong> 
            </div> 
           </td> 
           <td width="100"> 
            <asp:Label ID="lblCartTotal" runat="server" Text="0" /> 
           </td> 
          </tr> 
         </table> 
        </td> 
       </tr> 
      </table> 
     </LayoutTemplate> 
     <EditItemTemplate> 
      <tr> 
       <td colspan="5" align="center"> 
        <p> 
         <em>This cart is empty.</em> 
        </p> 
       </td> 
      </tr> 
     </EditItemTemplate> 
     <ItemTemplate> 
      <tr> 
       <td> 
        <table width="100%" border="0" cellspacing="0" cellpadding="0"> 
         <tr> 
          <td width="50"> 
           <a href='<%# ShoppingCartUrl %>?action=remove&id=<%# Eval("Product.Id") %>'>X</a> 
          </td> 
          <td width="400"> 
           <%# Eval("Product.DisplayName") %> 
          </td> 
          <td width="100"> 
           <label> 
            <asp:TextBox ID="txtQuantity" Text='<%# Eval("Quantity") %>' runat="server" size="3" /> 
           </label> 
          </td> 
          <td width="100"> 
           <%# Eval("Price", "{0:C}") %> 
          </td> 
          <td width="100"> 
           <%# Eval("TotalPrice", "{0:C}") %> 
          </td> 
         </tr> 
        </table> 
        <hr /> 
       </td> 
      </tr> 
     </ItemTemplate> 
    </asp:ListView> 

回答

2

您可以添加一個空InsertTemplate則並設置InsertItemPosition = 「LastItem」

+0

查看其他的答案爲一個例子 – mathijsuitmegen 2013-12-18 13:32:13

0

下面你可以找到購物車代碼的簡單示例。 它使用user757933答案中提供的'InsertItemTemplate'解決方案。 我發現這比使用需要「虛擬」數據源的「EditItemTemplate」更優雅的解決方案。

用法: 默認情況下,您應該看到一個空的購物車。當您取消註釋「麪包」,「蘋果」和「雞蛋」時,應該隱藏「本購物車爲空」消息,而您會看到購物車中出現三個物品。

[ASPX代碼]

<asp:ListView ID="lvShoppingCart" runat="server"> 
    <LayoutTemplate> 
     <pre> 
     --------------------------------------------------------------------------- 
     | Product   | Quantity   | Price   | Total  | 
     --------------------------------------------------------------------------- 
     <div id="itemPlaceHolder" runat="server"> 
     </div> 
     --------------------------------------------------------------------------- 
     |               | <asp:Label ID="lblCartTotal" runat="server" Text="0" /> | 
     --------------------------------------------------------------------------- 
     </pre> 
    </LayoutTemplate> 
    <InsertItemTemplate> 
     | This cart is empty              | 
    </InsertItemTemplate> 
    <ItemTemplate> 
     | <%# Container.DataItem.ToString().PadRight(17) %> |     |     |    | 
    </ItemTemplate> 
</asp:ListView> 

[C#代碼]

internal class Cart : IEnumerable<string> 
    { 
     public List<string> Items { get; set; } 

     public Cart() 
     { 
      Items = new List<string>(); 
     } 

     public IEnumerator<string> GetEnumerator() 
     { 
      return Items.GetEnumerator(); 
     } 

     IEnumerator IEnumerable.GetEnumerator() 
     { 
      return GetEnumerator(); 
     } 
    } 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     Cart _cart = new Cart(); 
     //_cart.Items.Add("bread"); 
     //_cart.Items.Add("apples"); 
     //_cart.Items.Add("eggs"); 

     lvShoppingCart.DataSource = _cart; 
     // Make sure the 'InsertItemTemplate' is hidden from view when items are added to the cart. 
     lvShoppingCart.InsertItemPosition = _cart.Items.Count == 0 ? InsertItemPosition.LastItem : InsertItemPosition.None; 
     lvShoppingCart.DataBind(); 

     Label _lblCartTotal = lvShoppingCart.FindControl("lblCartTotal") as Label; 
     if (_lblCartTotal != null) 
     { 
      _lblCartTotal.Text = string.Format("<strong>Total: </strong> {0}", _cart.Items.Count); 
     } 
    }