2013-08-16 4 views
-1

У меня есть ASP Repeater DataBound к DataTable, и я пытаюсь использовать код визуализации блока <% %> сделать некоторую проверку с помощью другой функции в проекте. В принципе, если пользователь не является администратором, я не хочу, чтобы отображался первый столбец.`` <% %> внутри Repeater не работает, порядок оценки `<%# %> и` `<% %>

Функция возвращается правильно, но она все еще всегда перескакивает в блок 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 просто опущено в случае отсутствия администратора (поэтому оно не должно быть проблемой, так как если бы держать его от получения Eval «Под ред).

Я нашел this link и подумал, что это просто оценка тегов привязки данных слишком рано. Я сделал несколько шагов и обнаружил, что сначала попытается оценить <%#Eval("CheckboxVAL") %>, ошибка (поскольку CheckboxVAL не существовал для не-админов), а затем вернуться и оценить операторы if. Я изменил его, так что не-админ DataTable также содержит столбец CheckboxVAL и просто оставьте его пустым. Теперь он будет оценивать пустой столбец, затем вернуться и проверить инструкции if, а не отображать первый столбец. Так что теперь это работает.

Это похоже на странное поведение. У кого-нибудь есть объяснение, почему он оценивает внутри оператора if, затем возвращается позже и проверяет условие?

+0

У вас есть два разных утверждения, является ли это намеренным? –

+0

Да, один для заголовка, и один для шаблона элемента – CDspace

ответ

2

Поскольку кажется, что вы решили свою проблему, я отвечу о вашем другом вопросе.

У кого-нибудь есть объяснение, почему он оценивает внутри оператора if, затем возвращается позже и проверяет состояние?

Databinding выражения <% #%> оцениваются раньше, чем встроенный код <%%>

От MSDN on databinding expressions

связывания данных выражений разрешаются, когда метод DataBind из контроля или вызывается класс Page. Для элементов управления, таких как элементы управления GridView, DetailsView и FormView , выражения привязки данных решаются автоматически во время события PreRender элемента управления и , вам не требуется явно вызывать метод DataBind.

От MSDN on inline code

Встроенный блок кода является сервер код, который выполняется во время этапе вывода страницы.

+0

А, я сделал несколько поисков, но не нашел эту первую ссылку.Таким образом, если я получаю это правильно, он выполняет код привязки данных при создании элементов ретранслятора (там, где была ошибка, игнорируя операторы if), тогда при рендеринге (после привязки данных) он вычисляет операторы if, тем самым скрывая этот столбец , пусто или нет – CDspace

+0

@CDspace вы его получили – Shoe