`< %%>`里面的Repeater工作不正常,评估`<%#%>`和`< %%>`的顺序

时间:2013-08-16 18:02:04

标签: c# asp.net

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

1 个答案:

答案 0 :(得分:2)

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

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

数据绑定表达式&lt;%#%&gt;评估早于内联代码&lt; %%&gt;

来自MSDN on databinding expressions

  

数据绑定表达式在数据绑定时解析   控件或Page类被调用。对于控件如   GridView,DetailsView和FormView控件,数据绑定表达式   在控件的PreRender事件期间自动解决   您不需要显式调用DataBind方法。

来自MSDN on inline code

  

嵌入式代码块是在页面期间执行的服务器代码   渲染阶段。