2013-08-16 69 views
-1

我有一個ASP中繼器數據綁定到一個DataTable,並想使用一個代碼塊渲染通過<% %>另一個函數做一些驗證在項目中。基本上,如果用戶不是管理員,我不希望顯示第一列。``<% %>裏面直放站不工作,評估'<%# %>的順序`和``<% %>

該函數返回正確,但它總是跳轉到if塊。我已經在另一個頁面上的另一個轉發器中嘗試了相同的代碼,並且它工作正常。任何想法爲什麼這個人表現得很奇怪?

<asp:Repeater runat="server" ID="batchesRPT"> 

    <HeaderTemplate> 
     <table> 
      <tr> <% if(myProject.myUserRole.IsUserInRole("ADMIN")) 
     { %> 
       <th>Select Batch</th> <% } %> 
       <th>Batch ID</th> 
       <th>Batch Date</th> 
      </tr> 
    </HeaderTemplate> 

    <ItemTemplate> 
     <tr> 
      <% if(GenKFI.myUserRole.IsUserInRole("ADMIN")) 
       { %> <td><%#Eval("CheckboxVAL") %></td> <% } %> 
       <td><%#Eval("BatchID") %></td> 
       <td><%#Eval("BatchDate") %></td> 
     </tr> 

    </ItemTemplate> 

    <FooterTemplate> 
     </table> 
    </FooterTemplate> 
</asp:Repeater> 

UPDATE: 在背後以前的代碼中,CheckboxVAL會簡單地在非管理員情況下省略(因此它不應該是一個問題,因爲如果將保持它越來越評估和演示「ED)。

我發現this link,並認爲它可能只是評估數據綁定標籤過早。我做了一些步驟,發現它會首先嚐試評估<%#Eval("CheckboxVAL") %>,出錯(因爲CheckboxVAL對於非管理員不存在),然後返回並評估if語句。我改變了它,所以非管理員的DataTable也包含了CheckboxVAL列,只是將它留空。現在它將評估一個空列,然後返回並檢查if語句,而不是渲染第一列。所以現在它工作。

這似乎是一種奇怪的行爲。有沒有人有解釋爲什麼它在if語句內進行評估,然後再回來檢查條件?

+0

你有兩個不同的if語句,是故意的嗎? –

+0

是的,一個用於標題,另一個用於項目模板 – CDspace

回答

2

由於您似乎已經解決了您的問題,因此我會回答您的其他問題。

有沒有人有解釋爲什麼它在if語句中進行評估,然後再回來檢查條件?

數據綁定表達式<%#%>比內聯代碼較早評價<%%>

MSDN on databinding expressions

數據綁定表達式得到解決當 控制的或DataBind方法頁面類被調用。對於諸如 GridView,DetailsView和FormView控件的控件,數據綁定表達式 會在控件的PreRender事件和 期間自動解析,因此不需要顯式調用DataBind方法。

MSDN on inline code

嵌入代碼塊是在頁面的 呈現階段執行服務器代碼。

+0

啊,我已經做了一些搜索,但沒有遇到第一個鏈接。所以,如果我正確地做到了這一點,它會在生成轉發器元素(這是錯誤發生的地方,忽略if語句)的同時執行數據綁定代碼,然後在渲染時(數據綁定後)評估if語句,從而隱藏該列,空或不是 – CDspace

+0

@CDspace你明白了 – Shoe

相關問題