`<;%%>;`内部中继器不工作,评估顺序`<;%#%>;`和`<;%%>;`
本文关键字:lt gt 顺序 评估 中继器 内部 工作 | 更新日期: 2023-09-27 18:27:56
我有一个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在非admin的情况下会被省略(所以它不应该是一个问题,因为if会阻止它被Eval’ed)。
我发现了这个链接,并认为它可能只是过早地评估数据绑定标记。我做了一些步骤,发现它会先尝试评估<%#Eval( "CheckboxVAL" ) %>
,然后出错(因为CheckboxVAL不适用于非管理员),然后返回并评估if语句。我更改了它,使非管理员DataTable也包含CheckboxVAL列,并将其留空。现在它将计算一个空列,然后返回并检查if语句,而不呈现第一列。所以现在它起作用了。
这似乎是一种奇怪的行为。有人能解释为什么它在if语句中进行评估,然后稍后返回并检查条件吗?
既然你似乎已经解决了你的问题,我将回答你的另一个问题。
有人解释为什么它在if语句中进行评估,然后稍后返回并检查条件吗
数据绑定表达式<%#%>早于内联代码<%%>进行求值
来自MSDN的数据绑定表达式
当控件或Page类的。对于诸如GridView、DetailsView和FormView控件、数据绑定表达式在控件的PreRender事件期间自动解析,并且不需要显式调用DataBind方法。
从MSDN在线代码
嵌入式代码块是在页面渲染阶段。