2012-04-17 30 views
2

我有一個UserControl,它具有包含照片列表的產品列表的Property。在.ascx我有一個DIV作爲所有照片的容器。這是現在的作品。使用runat =「server」訪問HTML元素中的foreach變量

<% 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屬性。這是行不通的,因爲它無法解決來自我的foreach循環的變量product。看起來runat="server"使foreach循環中的變量無法訪問,這是沒有意義的,因爲循環也必須在服務器上運行。

問:
如何訪問一個.as*x文件中的foreach循環定義的變量時,該元素有一個runat="server"?這甚至有可能嗎?如果不是,那麼完成我想要的任何替代方法是什麼?

ProductsControl.ascx.cs

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

Product.cs

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

有一個答案發布了一分鐘前有關使用'asp:DataList'而不是foreach循環。我嘗試對此發表評論,但在我能夠之前它已被刪除。誰添加了答案,然後刪除它應該把它帶回來,它可能真的幫助我! – 2012-04-17 20:27:19

回答

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

這個答案讓我面對自己。爲什麼我沒有想到這個?謝謝你的幫助!這就是我最終隱藏照片DIV和其他沒有值的數據的方式。我的標記現在非常醜陋,但它能完成這項工作。 – 2012-04-17 22:52:33

+0

大聲笑。很高興能幫上忙! :) – mgnoonan 2012-04-18 01:50:05

1

你可以通過測試照片的Count並設置它的css樣式隱藏<div>

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

這仍然會創建<div>,但它將「隱藏」在頁面上。

編輯:對於您使用託管控件的問題,如asp:Panel將呈現一個<div>。您必須根據您檢索的數據在User Control Load event期間動態創建控件,這些數據將涉及在您的用戶控件上添加child controls

+0

我也曾想過這個解決方案;如果沒有照片,只需添加'display:none;'作爲樣式。這將解決我遇到的具體問題,但更多的是「解決方法」。我仍然想知道是否實際上有一種方法可以在'runat'服務器元素中獲取foreach變量,因爲可能需要的用例比我的要多。雖然謝謝! – 2012-04-17 20:23:06

+0

我相信你所要求的簡短答案是「不」。託管控件無法訪問服務器端腳本變量,例如設置屬性值。使用服務器端腳本可以做的最好的事情是使用腳本變量呈現html控件。否則,您必須使用託管控件並動態創建它們。 – CAbbott 2012-04-17 20:33:22

+0

感謝您的闡述,我決定現在就爲您解決方案。我想讓這個問題有更多的時間讓人們閱讀和回答。如果沒有更好的發佈,但我會接受你的。 – 2012-04-17 20:46:01

0

下午好,你可以嘗試使用jQuery來處理這個問題對你來說,這樣的事情也許:

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

這還沒有測試過,但我認爲它應該讓你去。