2009-08-21 50 views
6

<asp:Repeater> được lái xe cho tôi điên ..Làm thế nào tôi có thể làm một câu lệnh if bên trong một repeater

tôi cần phải làm

<ItemTemplate> 
    <% if (Container.DataItem("property") == "test") {%> 
     I show this HTML 
    <% } else { %> 
     I show this other HTML 
    <% } %> 
</ItemTemplate> 

Nhưng tôi không thể cho cuộc đời của tôi tìm mọi cách để làm cho điều đó xảy ra. Ternary là không tốt, bởi vì số lượng HTML là khá lớn, thiết lập nhãn thông qua một sự kiện DataBind không phải là rất tốt, hoặc, vì tôi sẽ phải có khối lớn của HTML trong code-behind.

Chắc chắn có một cách để làm điều này ....

+4

Trong câu lệnh if của bạn, bạn đang sử dụng bài tập không phải là toán tử bình đẳng ... đây có phải là lỗi đánh máy hay mã thực tế của bạn không? –

Trả lời

7

Bạn có thể thử tạo ra một loại lớp ViewModel, thực hiện quyết định trên code-behind của bạn, và sau đó được hạnh phúc với repeater bạn, chỉ cần hiển thị dữ liệu nó đang được đưa ra.

Đây là cách tách logic khỏi giao diện người dùng. Sau đó, bạn có thể có một giao diện người dùng đơn giản chỉ hiển thị dữ liệu mà không phải quyết định cách hiển thị.

+1

Tôi nghĩ đây là điểm mấu chốt của nó, có dữ liệu hoàn toàn sạch sẽ trước khi sử dụng bộ lặp. Cuộc sống sẽ tốt đẹp nếu bạn có thể sử dụng các bộ so sánh cơ bản trong bộ lặp. – Monsters

3

Bạn có thể làm điều này với người dùng điều khiển:

<ItemTemplate> 
    <uc:Content1 runat='server' id='content1' visible='<%# Container.DataItem("property") == "test" %>'/> 
    <uc:Content2 runat='server' id='content2' visible='<%# Container.DataItem("property") != "test" %>'/> 
</ItemTemplate> 
+1

Vâng, tôi đã nghĩ đến việc đó, nó sẽ hoạt động, nhưng một chút giải pháp. Tôi đã quyết định rằng lặp lại chỉ là không lên cho nhiệm vụ, và đi cho một vòng lặp for/tiếp theo, làm việc một điều trị. – Monsters

3

Hình như tôi bị này trộn lẫn với các liên kết dữ liệu thực tế

Bạn có thể làm điều đó như vậy:

<asp:Repeater runat="server"> 
    <ItemTemplate>  
     <% if (((Product)Container.DataItem).Enabled) { %> 
     buy it now! 
     <% } else {%> 
     come back later! 
     <% } %> 
    </ItemTemplate> 
</asp:Repeater> 

+0

Container.dataitem chỉ tồn tại trong biến ..? đánh dấu, ví dụ: <% # – Monsters

+0

Bạn nói đúng, tôi nghĩ mình nhớ đã làm một cái gì đó như thế này và bây giờ tôi đang nhìn vào mã của tôi nó đã được logic trên các giá trị không databinded. –

19

Y bạn có thể sử dụng khả năng hiển thị phía máy chủ:

<ItemTemplate> 
    <div runat="server" visible='<% (Container.DataItem("property") == "test") %>'> 
     I show this HTML 
    </div> 
    <div runat="server" visible='<% (Container.DataItem("property") != "test") %>'> 
     I show this other HTML 
    </div> 
</ItemTemplate> 
+0

Đây là một giải pháp khá tốt. – Monsters

+0

đây là một giải pháp tốt nếu logic quyết định sẽ được xác định và sử dụng bởi các frontenders mà _does not_ có quyền truy cập vào mã C# cơ bản. – mslot

+0

HTML sẽ vẫn được xử lý hai lần .... chỉ vì nó có thể nhìn thấy không có nghĩa là trình biên dịch sẽ bỏ qua phần mã –

0

Tôi gặp sự cố tương tự và tình cờ gặp phải trang này. Cảm ơn câu trả lời tuyệt vời, Gavin và Keltex đã giúp tôi đi đúng hướng nhưng tôi đã có một chút thời gian khó khăn để làm việc này trên trang của tôi. Cuối cùng tôi đã có thể có được nó để làm việc với boolean này, vì vậy tôi muốn chia sẻ cho hậu thế:

Hiện Checkbox nếu sai

<asp:CheckBox ID="chk_FollowUp" Visible='<%# (DataBinder.Eval(Container.DataItem, "FollowUp").ToString() == "False") %>' runat="server" /> 

Hiện Cờ img nếu đúng

<asp:Image ID="img_FollowUp" AlternateText="Flagged" ImageUrl="Images/flag.gif" runat="server" 
    Visible='<%# DataBinder.Eval(Container.DataItem, "FollowUp") %>' Height="30" Width="30" /> 
+0

oh, và chuyển đổi giữa chúng với: '((CheckBox) người gửi) .NamingContainer.FindControl ("chk_FollowUp") Hiển thị = false; ((CheckBox) người gửi) .NamingContainer.FindControl ("img_FollowUp"). Visible = true; ' – RJB

0

Trước tiên, bạn phải xác định biến Số đếm trong tệp Page.cs của mình

<%if (Count == 0) 
         { 
          %> 
        <div style="background-color:#cfe9ed" class="wid_100 left special_text"><%# Eval("CompanyName") %></div> 
         <%} 
         else if (Count == TotalCount - 1) 
         { 
          %> 
         <div style="background-color:#f2f1aa" class="wid_100 left special_text"><%# Eval("CompanyName") %></div> 
         <%} 
         else 
         { 
           %> 
         <div class="wid_100 left special_text"><%# Eval("CompanyName") %></div><% } %> 
         <%Count++; %> 
Các vấn đề liên quan