2009-07-05 31 views
23

Tôi muốn hiển thị một số phần nhất định của một ItemTemplate dựa trên liệu một trường bị ràng buộc là null. Lấy ví dụ đoạn mã sau:ASP.Net: Logic có điều kiện trong một ItemView của ListView

(Mã số như LayoutTemplate đã được loại bỏ cho ngắn gọn)

<asp:ListView ID="MusicList" runat="server"> 
    <ItemTemplate> 
     <tr> 
      <% 
       if (Eval("DownloadLink") != null) 
       { 
      %> 
      <td> 
       <a href="<%#Eval("DownloadLink") %>">Link</a> 
      </td> 
      <% 
       } %> 
     </tr> 
    </ItemTemplate> 
</asp:ListView> 

Trên đây cung cấp cho các lỗi thời gian chạy sau:

Databinding methods such as Eval(), XPath(), and Bind() can only be used in the context of a databound control.

Vì vậy, làm thế nào có thể đặt một số logic có điều kiện (như trên) trong một ItemTemplate?

+1

Đây là loại điều mà hiện đang lái xe cho tôi một chút điên rồ. Điều này là rất dễ dàng trong ASP.net MVC nhưng một bộ phim tổng số trong webforms –

Trả lời

34

Điều gì về việc ràng buộc thuộc tính "Hiển thị" của điều khiển với điều kiện của bạn? Một cái gì đó như:

<asp:ListView ID="MusicList" runat="server"> 
    <ItemTemplate> 
    <tr runat="server" Visible='<%# Eval("DownloadLink") != null %>'> 
     <td> 
      <a href='<%#Eval("DownloadLink") %>'>Link</a> 
     </td> 
    </tr> 
    </ItemTemplate> 
</asp:ListView> 
+0

Hmm điểm thú vị ... nhưng không phải là có một số cách để tiêm các khối logic trong ItemTemplate? –

+2

sửa đổi câu trả lời của bạn để trả về một bool thay vì chuỗi –

+1

Tôi đã thử gần đây và gặp lỗi thời gian chạy: "Thẻ máy chủ không được định dạng đúng." – Kyle

6

Tôi không đề nghị này như một cách tiếp cận tốt, nhưng bạn có thể làm việc xung quanh vấn đề này bằng cách bắt các mục hiện hành trong trường hợp OnItemDataBound, lưu trữ nó trong một tài sản công cộng hoặc trường và sau đó sử dụng mà trong logic điều kiện của bạn.

Ví dụ:

<asp:ListView ID="MusicList" OnItemDataBound="Item_DataBound" runat="server"> 
    <ItemTemplate> 
     <tr> 
      <% 
       if (CurrentItem.DownloadLink != null) 
       { 
      %> 
      <td> 
       <a href="<%#Eval("DownloadLink") %>">Link</a> 
      </td> 
      <% 
       } %> 
     </tr> 
    </ItemTemplate> 
</asp:ListView> 

Và ở phía máy chủ thêm mã sau vào mã của bạn đằng sau file:

public MusicItem CurrentItem { get; private set;} 

protected void Item_DataBound(object sender, RepeaterItemEventArgs e) 
{ 
    CurrentItem = (MusicItem) e.Item.DataItem; 
} 

Lưu ý rằng thủ thuật này sẽ không làm việc trong một điều khiển UpdatePanel.

1

Nếu bạn có 2 cấu trúc khác nhau mà được chi trả theo một điều kiện sau đó sử dụng các tấm

<asp:ListView ID="MusicList" runat="server"> 
    <ItemTemplate> 
     <tr> 
      <asp:Panel ID="DownloadNull" runat="server" Visible="<%# Eval("DownloadLink") == null %>" > 
      <td> Album Description BlaBlaBla <img src="../images/test.gif"> </td> 
      </asp:Panel> 

      <asp:Panel ID="DownloadNotNull" runat="server" Visible="<%# Eval("DownloadLink") != null %>" > 
      <td> Album Description BlaBlaBla <img src="../images/test.gif"> 
       <a href='<%# Eval("DownloadLink")' >Download</a> 
       ..... 
      </td> 
      </asp:Panel> 
     </tr> 
    </ItemTemplate> 
</asp:ListView> 
8

Để giải quyết "Thẻ máy chủ được không cũng được hình thành." đối với các câu trả lời liên quan đến khả năng hiển thị, hãy xóa dấu ngoặc kép khỏi thông số Hiển thị =.

Vì vậy, nó sẽ trở thành:

<tr runat="server" Visible=<%# Eval("DownloadLink") != null ? true : false %>> 
+1

Bạn cũng có thể sử dụng dấu nháy đơn xung quanh điều kiện. Tôi đã có dấu ngoặc kép và nhận được "thẻ máy chủ không được hình thành tốt" nhưng khi tôi thay đổi chúng thành dấu nháy đơn nó làm việc tốt. –

Các vấn đề liên quan