-1

我有一个 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 语句中进行评估,然后再回去检查条件?

4

1 回答 1

2

既然您似乎已经解决了您的问题,我将回答您的其他问题。

有没有人解释为什么它在 if 语句中进行评估,然后再回去检查条件?

数据绑定表达式 <%# %> 的计算早于内联代码 <% %>

来自MSDN 关于数据绑定表达式

当调用控件或 Page 类的 DataBind 方法时,将解析数据绑定表达式。对于 GridView、DetailsView 和 FormView 控件等控件,数据绑定表达式在控件的 PreRender 事件期间自动解析,您无需显式调用 DataBind 方法。

来自MSDN 的内联代码

嵌入式代码块是在页面呈现阶段执行的服务器代码。

于 2013-08-16T19:55:56.053 回答