我有一个ASP Repeater DataBound到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')。
我找到了this link,并认为可能只是过早地评估数据绑定标签。我做了一些步骤,发现它会首先尝试评估<%#Eval( "CheckboxVAL" ) %>
,错误输出(因为非管理员不存在CheckboxVAL),然后返回并评估if语句。我更改了它,因此非管理员DataTable也包含CheckboxVAL列,并将其留空。现在它将评估一个空列,然后返回并检查if语句,而不是渲染第一列。所以现在它有效。
这似乎是一种奇怪的行为。有没有人解释为什么它在if语句中进行评估,然后再回去查看条件?
答案 0 :(得分:2)
由于您似乎已经解决了问题,我将回答您的其他问题。
有没有人解释为什么它在if语句中进行评估,然后再回去查看条件?
数据绑定表达式&lt;%#%&gt;评估早于内联代码&lt; %%&gt;
来自MSDN on databinding expressions
数据绑定表达式在数据绑定时解析 控件或Page类被调用。对于控件如 GridView,DetailsView和FormView控件,数据绑定表达式 在控件的PreRender事件期间自动解决 您不需要显式调用DataBind方法。
嵌入式代码块是在页面期间执行的服务器代码 渲染阶段。