`<;%%>;`内部中继器不工作,评估顺序`<;%#%>;`和`<;%%>;`

本文关键字: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在线代码

嵌入式代码块是在页面渲染阶段。