ListView - 在空数据源上显示LayoutTemplate

时间:2010-10-21 17:59:50

标签: c# asp.net templates listview

对于购物车页面,项目列表显示在html表格中。 我使用了ListView,它运行得很好。

当购物车为空时,会显示“此购物车为空”文字。但它只渲染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 个答案:

答案 0 :(得分:2)

您可以添加空的 InsertItemTemplate 并设置 InsertItemPosition =“LastItem”

答案 1 :(得分: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);
        }
    }