页面循环问题asp.net

时间:2010-11-07 17:45:49

标签: c# asp.net repeater

我正在使用嵌套转发器。我渲染了几个组,每个组都有我需要渲染不同属性的成员。

我在嵌套转发器上使用ItemDataBound来找出嵌套转发器当前呈现的成员。我有< %%> .aspx中的标签检查当前用户是否具有某个属性,如果有,我会渲染需要去那里的div和其他HTML元素。

所有数据都是正确的。当我调试时,我会收集正确的数据,并获得有关用户是谁以及用户具有哪些属性的正确信息。我将当前评估的用户保存在受保护的字符串currentRenderedUser中,我用它来查找用户在aspx文件中的用户。

问题在于< %%>在aspx上进行评估时,转发器已经遍历了所有的集合或其他内容,因为currentRenderedUser在aspx文件的每个evalutaion期间都是相同的。

我不知道“< %%>”的正确术语抱歉,在aspx文件中有代码。

这是aspx的相关部分(我认为):

<ItemTemplate>
    <!-- nested repeater data -->

    <tr>
        <td width="50%"><div class="memberName"><%# DataBinder.Eval(Container.DataItem, "userEmail" )%></div></td>


        <div style="display: none;"></div>
        <% if (CheckIfUserIsAdmin(email, currentRenderedGroup))
                    {  %>

                   <%if (CheckIfUserIsAdmin(currentRenderedUser, currentRenderedGroup))
                     { //Checks so that the user being rendered isn't already admin%>
                          <td><div style="margin-right:30px;" class="makeAdminButton"></div></td>
                    <% }
                     else
                     {%>
                        <td><div style="margin-right:30px;" class="makeAdminButton"><asp:ImageButton ID="ImageButtonMakeUserAdmin" CommandName="MakeAdmin" BorderWidth="0" ImageUrl="~/gfx/doAdmin.png" CommandArgument='<%#Convert.ToString(DataBinder.Eval(Container.DataItem, "userEmail" )) + " " +  Convert.ToString(DataBinder.Eval(((RepeaterItem)Container.Parent.Parent).DataItem, "groupId"))%>' runat="server" AlternateText="Make admin" /></div></td>
                        <td><div class="removeUserButton"><asp:ImageButton ID="ImageButtonRemoveUserFromGroup" CommandName="RemoveUserFromGroup" BorderWidth="0" ImageUrl="~/gfx/can.png" CommandArgument='<%# Convert.ToString(DataBinder.Eval(Container.DataItem, "userEmail" )) + " " + Convert.ToString(DataBinder.Eval(((RepeaterItem)Container.Parent.Parent).DataItem, "groupId"))%>' runat="server" AlternateText="Delete" /></div></td>
                                <% } %>
       <%}%>

    </tr>


</ItemTemplate>

这是评估当前用户的后端的一部分:

protected void NesterRepeater_ItemDataBound(object sender,
                       System.Web.UI.WebControls.RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.AlternatingItem
        || e.Item.ItemType == ListItemType.Item)
       {
           DataRowView dataRowView = (DataRowView)e.Item.DataItem;

           string memberInGroup = Convert.ToString(dataRowView["userEmail"]);
           currentRenderedUser = memberInGroup;
       }
}

如何以更好(或至少,工作)的方式解决这个问题? 感谢

1 个答案:

答案 0 :(得分:1)

问题是事件ItemDataBound是先执行的,所以你可能总是从Repeater的DataSource获取最后一条记录的值,如果我没弄错的话。

最好这样做:

<ItemTemplate>
    <tr>
        <td width="50%"><div class="memberName"><%# DataBinder.Eval(Container.DataItem, "userEmail" )%></div></td>
        <div style="display: none;"></div>
        <asp:PlaceHolder ID="phNoAdmin" runat="server" Visible="false">
            <td><div style="margin-right:30px;" class="makeAdminButton"></div></td>
        </asp:PlaceHolder>

        <asp:PlaceHolder ID="phAdmin" runat="server" Visible="false">
            <td><div style="margin-right:30px;" class="makeAdminButton"><asp:ImageButton ID="ImageButtonMakeUserAdmin" CommandName="MakeAdmin" BorderWidth="0" ImageUrl="~/gfx/doAdmin.png" CommandArgument='<%#Convert.ToString(DataBinder.Eval(Container.DataItem, "userEmail" )) + " " +  Convert.ToString(DataBinder.Eval(((RepeaterItem)Container.Parent.Parent).DataItem, "groupId"))%>' runat="server" AlternateText="Make admin" /></div></td>
            <td><div class="removeUserButton"><asp:ImageButton ID="ImageButtonRemoveUserFromGroup" CommandName="RemoveUserFromGroup" BorderWidth="0" ImageUrl="~/gfx/can.png" CommandArgument='<%# Convert.ToString(DataBinder.Eval(Container.DataItem, "userEmail" )) + " " + Convert.ToString(DataBinder.Eval(((RepeaterItem)Container.Parent.Parent).DataItem, "groupId"))%>' runat="server" AlternateText="Delete" /></div></td>
        </asp:PlaceHolder>
    </tr>
</ItemTemplate>

背后的代码:

protected void NesterRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item)
    {
        DataRowView dataRowView = (DataRowView)e.Item.DataItem;

        PlaceHolder phNoAdmin = e.Item.FindControl("phNoAdmin") as PlaceHolder;
        PlaceHolder phAdmin = e.Item.FindControl("phAdmin") as PlaceHolder;

        string memberInGroup = Convert.ToString(dataRowView["userEmail"]);
        currentRenderedUser = memberInGroup;

        if (CheckIfUserIsAdmin(email, currentRenderedGroup))
        { 
            if (CheckIfUserIsAdmin(currentRenderedUser, currentRenderedGroup))
            {
                phNoAdmin.Visible = true;
                phAdmin.Visible = false;
            }
            else
            {
                phNoAdmin.Visible = false;
                phAdmin.Visible = true;
            }
        }            
    }
}

如果你为了可维护性原因而绑定我在代码中写的2 PlaceHolder控件中的数据会更好。

HTH