2010-09-26 59 views
4

在ASP網數據綁定控件可以用最好的eval()函數的語法:爲什麼我不能合併if和eval?最好的選擇是什麼?

<div><%# Eval("MyProp") %></div> 

,但它不可能與條件語句結合是它?:

<% if (Eval("MyProp")!="") { %> 
<div><%# Eval("MyProp") %></div> 
<%} %> 

會很好有這個選擇。

所以 - 我的選擇是將部分標記放在CodeBehind中。我真的很喜歡把它放在那裏。任何其他可能性?

+0

使用正則內嵌代碼使用對象的效果要好得多<%,如果(mydata.MyProp!= 「」){%>

<%=mydata.MyProp%>
<%}%> ...結案我猜 – joeriks 2010-09-26 10:58:29

回答

7
<div runat="server" visible='<%# !String.IsNullOrEmpty(Eval("MyProp") as string) %>'> 
    <%# Eval("MyProp") %> 
</div> 

編輯2010年9月30日

現在,我有一點點的時間,我覺得我應該對我的回答擴展。特別是考慮到這個問題是一個重複的,已經有我的原始a better answer。所以我會解決你的問題的第一部分:

爲什麼你不能合併if和eval?原因在於<% ... %>代碼塊在頁面生命週期的渲染階段期間執行。 ASP.NET將你的代碼(在這種情況下爲if語句)放入一個函數中,然後將該函數作爲代理傳遞給SetRenderMethodDelegate。問題是Eval會評估由Page.GetDataItem返回的對象上的表達式「MyProp」。 Page.GetDataItem有點神奇,只有在調用堆棧中早些時候調用了DataBind纔會返回值。到渲染階段到來時,所有數據綁定都已完成。因此,當您撥打Eval,這隱含地調用Page.GetDataItem,引發以下錯誤:「Databinding方法[...]只能在數據綁定控件的上下文中使用。」

所以<% ... %>代碼塊將不起作用,但<%# ... %>代碼塊又如何呢?data-binding expressions?數據綁定表達式會在DataBind的調用中在頁面生命週期—的期望部分中運行。然而,這裏的操作詞是表達式。一個if語句不是一個表達式。編輯器會將您在<%# ... %>之間擲出的任何內容評估爲表達式。如果你在那裏放置一個語句,編譯器會拋出一個錯誤。

因此我們得出在一個控制的可見屬性數據綁定表達調用評估和演示的成語。 Eval與數據綁定表達式兼容;寫一個表達式就足以分配一個屬性的值;並且可見屬性能夠實現類似於使用內嵌if語句的效果。 最後提示:如果您曾經在沒有任何現有控件的情況下自然添加條件,您可以始終使用<asp:PlaceHolder>,該控件不會向標記中添加任何標記。

+0

visible =「False」會起作用,但不是這樣一個優雅的解決方案,你覺得呢? – joeriks 2010-09-28 17:50:40

+0

再次思考 - 這確實是一個很好的解決方案,它會從標記中刪除整個標記。 (我的第一個想法是它會添加style =「display:none」。)謝謝! – joeriks 2010-09-30 12:28:13

+0

感謝您的回覆,這是我一直在努力的解決方案。 – montueron 2014-07-28 23:34:01

1

這是因爲Eval("MyProp")返回對象,你不能比較對象與字符串。你可能需要把它轉換爲字符串(如果MyProp是當然是s​​tring類型的話)。

+0

沒有工作對我來說,並且搜索一下,我真的認爲這是一個死路一條。 – joeriks 2010-09-26 11:57:12

-1
<% if ((string)Eval("MyProp") != "") 
{ %> 
<div> 
    <%# Eval("MyProp") %></div> 
<%} %> 

<%# (string)Eval("MyProp") != "" ? string.Format("<div>{0}</div>", Eval("MyProp")) : "" %> 
相關問題