2013-08-16 53 views
-1

我有一个ASP中继器数据绑定到一个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> 

UPDATE: 在背后以前的代码中,CheckboxVAL会简单地在非管理员情况下省略(因此它不应该是一个问题,因为如果将保持它越来越评估和演示“ED)。

我发现this link,并认为它可能只是评估数据绑定标签过早。我做了一些步骤,发现它会首先尝试评估<%#Eval("CheckboxVAL") %>,出错(因为CheckboxVAL对于非管理员不存在),然后返回并评估if语句。我改变了它,所以非管理员的DataTable也包含了CheckboxVAL列,只是将它留空。现在它将评估一个空列,然后返回并检查if语句,而不是渲染第一列。所以现在它工作。

这似乎是一种奇怪的行为。有没有人有解释为什么它在if语句内进行评估,然后再回来检查条件?

+0

你有两个不同的if语句,是故意的吗? –

+0

是的,一个用于标题,另一个用于项目模板 – CDspace

回答

2

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

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

数据绑定表达式<%#%>比内联代码较早评价<%%>

MSDN on databinding expressions

数据绑定表达式得到解决当 控制的或DataBind方法页面类被调用。对于诸如 GridView,DetailsView和FormView控件的控件,数据绑定表达式 会在控件的PreRender事件和 期间自动解析,因此不需要显式调用DataBind方法。

MSDN on inline code

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

+0

啊,我已经做了一些搜索,但没有遇到第一个链接。所以,如果我正确地做到了这一点,它会在生成转发器元素(这是错误发生的地方,忽略if语句)的同时执行数据绑定代码,然后在渲染时(数据绑定后)评估if语句,从而隐藏该列,空或不是 – CDspace

+0

@CDspace你明白了 – Shoe

相关问题