2010-05-06 69 views
2

具有以下標記條件顯示在ASP.NET

<li class="blabla"> 
     <asp:LinkButton ID="myBtn" runat="server" OnCommand="myBtn_Command" /> 
    </li> 

有有條件使其不使li項目將服務器單元(runat="server")優雅的方式?重寫Render()也不是一個選項。

p.s. 這是一個列表的內容,但據我所知,在Repeater和ListView中都沒有辦法控制FooterTemplate的可見性。

回答

3

動態改變轉發器的footerTemplate的知名度,你可以使用中繼器的ItemDataBound事件:

protected void rptTest_ItemDataBound(object sender, RepeaterItemEventArgs e) 
    { 
     if (e.Item.ItemType == ListItemType.Footer) 
     { 
      e.Item.Visible = false; 
     } 
    } 

另一種選擇可能是動態呈現一些JavaScript來隱藏/顯示您的內容,但這種止跌首先不要停止渲染內容。

第三,asp:placeholder控件不會自己渲染任何html,因此您可以在Nikos Steiakakis的答案中使用它來代替asp:Panel

+1

我怎麼會錯過這個功能?謝謝!! – UserControl 2010-05-06 09:10:00

3

您可以使用Panel(或div)容器的方法,以便相應地隱藏或顯示容器。

<asp:Panel ID="panelContainer" runat="server" Visible='<%= ShowButton %>'> 
<li class="blabla"> 
     <asp:LinkButton ID="myBtn" runat="server" OnCommand="myBtn_Command" /> 
</li> 
</asp:Panel> 

其中顯示按鈕是在服務器端代碼的受保護/公共布爾變量,這將需要的值根據你的表示按鈕或不的條件真或假。

你可以做到這一點的另一種方法是使ShowButton變量成爲一個字符串,它將相應地取值爲'visible'或'hidden'並設置li的可見性。即

<li class="blabla" style='visibility: <%= ShowButton %';"> 
     <asp:LinkButton ID="myBtn" runat="server" OnCommand="myBtn_Command" /> 
</li> 
+0

這與使li項目成爲一個服務器元素以及我不需要的額外html容器相同(面板總是呈現給div,不是嗎?) – UserControl 2010-05-06 08:02:23

+0

@frogbot是的,面板呈現爲div,並且你也可以用div來做到這一點,主要區別在於'ShowButton'應該是一個字符串並且將值'隱藏'或'可見',並且幾乎可以做同樣的事情。 另一方面,你可以用同樣的方式設置li的可見性。我會在你的答案中編輯它。 – 2010-05-06 08:07:45

0

你最好的選擇是最簡單的一種,它是做你的建議,使李加RUNAT =「服務器」的服務器端控件。這就是runat =「server」的用途。

根據您的意見,您可以嘗試一個佔位符控件並在您的服務器端代碼中,可選擇輸出您的列表項目和按鈕。

+0

我不希望我的ViewState在輸出標記中增長或具有自動生成的標識。 – UserControl 2010-05-06 08:11:13

+0

這將對您的ViewState產生微不足道的影響。真。試試看看。如果您不想在標記中使用自動生成的標識,請升級到ASP.NET 4,您可以在其中控制ClientID,或者如果這不是選項,請使用完全乾淨並且沒有ViewState的MVC。 – 2010-05-06 08:19:22

+0

否則,看看我編輯的答案,另一個選項 – 2010-05-06 08:21:37