我有一个 ASP Repeater DataBound to a 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>
更新: 在前面的代码中,CheckboxVAL 在非管理员情况下将被简单地省略(所以它不应该是一个问题,因为 if 会阻止它被评估)。
我找到了这个链接,并认为它可能只是过早地评估数据绑定标签。我做了一些步骤,发现它会首先尝试评估<%#Eval( "CheckboxVAL" ) %>
,错误输出(因为非管理员不存在 CheckboxVAL),然后返回并评估 if 语句。我对其进行了更改,因此非管理员 DataTable 还包含 CheckboxVAL 列,并将其留空。现在它将评估一个空列,然后返回并检查 if 语句,而不是呈现第一列。所以现在它可以工作了。
这似乎是一种奇怪的行为。有没有人解释为什么它在 if 语句中进行评估,然后再回去检查条件?