2

我有一个 UserControl,它有一个包含照片列表的产品列表的属性。在.ascx我有一个DIV作为所有照片的容器。这就像现在一样工作。

<% foreach (var product in Products) { %>
    <div class="product">
        <div class="product-photos">
            <% foreach (var photo in product.Photos) { %>
                <img src="<%= photo.Url %>" alt="<%= product.Name %> Photo"/>
            <% } %>
        </div>
        <!-- Other product markup/data here... -->
    </div>
<% } %>

DIV如果没有照片,我现在正试图隐藏。我的想法是让“产品照片”DIV有一个runat="server"并赋予它一个Visible属性。这不起作用,因为它无法解析product来自我的foreach循环的变量。这似乎runat="server"使循环中的变量foreach无法访问,这没有意义,因为循环也必须在服务器上运行。

问题:当元素具有
如何访问foreach内循环中?这甚至可能吗?如果不是,那么实现我想要的替代方法是什么?.as*xrunat="server"

ProductsControl.ascx.cs

public partial class ProductsControl: UserControl
{
    public IList<Product> Products { get; set; }
}

产品.cs

public class Product
{
    public IList<Photo> Photos { get; set; }
    // Other properties here...
}
4

3 回答 3

2

为什么不在创建 div 之前检查照片计数?

<% foreach (var product in Products) { %>
    <div class="product">
        <% if (product.Photos.Count > 0) { %>
            <div class="product-photos">
                <% foreach (var photo in product.Photos) { %>
                <img src="<%= photo.Url %>" alt="<%= product.Name %> Photo"/>
                <% } %>
            </div>
        <% } %> 
        <!-- Other product markup/data here... -->
    </div>
<% } %> 
于 2012-04-17T20:48:53.043 回答
1

<div>您可以通过测试Count照片并设置它的 css 样式来隐藏它:

<div class="product-photos" style="<%= product.Photos.Count == 0 ? "display=none;" : "" %> ">

这仍然会创建,<div>但它会“隐藏”在页面上。

编辑:关于使用托管控件的问题,例如asp:Panel将呈现<div>. 您必须在用户控件加载事件期间根据您检索到的数据动态创建控件,这将涉及添加child controls到您的用户控件。

于 2012-04-17T20:13:01.617 回答
0

下午好,您可以尝试使用 jquery 为您处理这个问题,可能是这样的:

 $(function() {
      $('.product-photos').each(function() {
           var div = $(this);
           if ($(div).find('img').length === 0)
                div.hide();
      });
 });

这还没有经过测试,但我相信它应该能让你继续前进。

于 2012-04-17T20:13:08.090 回答