我正在使用嵌套转发器。我渲染了几个组,每个组都有我需要渲染不同属性的成员。
我在嵌套转发器上使用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;
}
}
如何以更好(或至少,工作)的方式解决这个问题? 感谢
答案 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