2010-11-07 75 views
0

我正在使用嵌套中繼器。我渲染了幾個組,每個組都有我需要渲染出不同屬性的成員。Page cycle問題asp.net

我在嵌套中繼器上使用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; 
     } 
} 

我怎樣才能用更好的(或至少是工作的)方式解決這個問題? 謝謝

回答

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

+0

非常感謝!我已經在這個幾個小時了..完美!這個確切的解決方案很好。 – Phil 2010-11-07 18:50:39