asp.net页面循环问题

发布于 2024-10-01 05:03:47 字数 2857 浏览 0 评论 0原文

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

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

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

问题是,到了 <% %> 的时候,在 aspx 被评估时,转发器已经完成了所有设置或其他内容,因为 currentRenderedUser 在 aspx 文件中的每次评估期间都是相同的。

我不知道“<% %>”的正确术语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;
       }
}

我怎样才能以更好(或至少有效)的方式解决这个问题? 谢谢

I am using nested repeaters. I render several groups and every group has members that I need to render out different properties to.

I am using ItemDataBound on the nested repeater to find out which member the nested repeater is rendering out at the moment. I have <% %> tags in the .aspx which checks if the current user has a certain property, and if it has, I render the divs and other HTML elements that need to go there.

All the data is correct. When I debug I collect the correct data and I get the right info about who the user is and what properties the user has. I save the current evaluated user in a protected string currentRenderedUser that I use to find out who the user is in the aspx file.

The problem is that by the time the <% %> on the aspx gets evaluated the repeater has already gone through all the sets or something, because the currentRenderedUser is the same during every evalutaion in the aspx file.

I don't know the correct terminology for "<% %>" code in the aspx file, sorry.

This is the relevant parts of the aspx (I think):

<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>

And this is the part of the back-end that evaluates the current user:

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;
       }
}

How can I solve this in a better (or atleast, working) way?
Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

楠木可依 2024-10-08 05:03:47

问题是 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 控件内,出于可维护性的原因,我也在代码后面编写了该控件,这会更好。

华泰

The problem is that the event ItemDataBound is executed first so you probably always get the value of the last record from the Repeater's DataSource if I'm not mistaken.

It is better to do it this way:

<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>

And the code behind:

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;
            }
        }            
    }
}

It would be better if you bind the data inside the 2 PlaceHolder control I wrote also in code behind for maintainability reason.

HTH

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文