【问题标题】:List getting cleared every button click inside Update Panel?每次单击更新面板内的按钮都会清除列表?
【发布时间】:2010-04-22 17:39:21
【问题描述】:

不,这不是这个问题的副本:Button in update panel is doing a full postback?

我在更新面板中有一个下拉菜单,我试图让它允许使用该页面的人将用户添加到绑定到网格视图的列表中。该列表是一个全局变量,在 page_load 上我将其设置为 gridview 的数据源并对其进行数据绑定。但是,无论何时我单击“添加用户”按钮,或从列表中删除用户的按钮。尽管所有这些元素都在更新面板中,但它似乎正在做一个完整的回帖。

代码背后:

Public accomplishmentTypeDao As New AccomplishmentTypeDao()
Public accomplishmentDao As New AccomplishmentDao()
Public userDao As New UserDao()
Public facultyDictionary As New Dictionary(Of Guid, String)
Public facultyList As New List(Of User)
Public associatedFaculty As New List(Of User)
Public facultyId As New Guid

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    Page.Title = "Add a New Faculty Accomplishment"
    ddlAccomplishmentType.DataSource = accomplishmentTypeDao.getEntireTable()
    ddlAccomplishmentType.DataTextField = "Name"
    ddlAccomplishmentType.DataValueField = "Id"
    ddlAccomplishmentType.DataBind()

    facultyList = userDao.getListOfUsersByUserGroupName("Faculty")

    For Each faculty As User In facultyList
        facultyDictionary.Add(faculty.Id, faculty.LastName & ", " & faculty.FirstName)
    Next

    If Not Page.IsPostBack Then
        ddlFacultyList.DataSource = facultyDictionary
        ddlFacultyList.DataTextField = "Value"
        ddlFacultyList.DataValueField = "Key"
        ddlFacultyList.DataBind()
    End If

    gvAssociatedUsers.DataSource = associatedFaculty
    gvAssociatedUsers.DataBind()


End Sub

Protected Sub deleteUser(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.CommandEventArgs)
    facultyId = New Guid(e.CommandArgument.ToString())
    associatedFaculty.Remove(associatedFaculty.Find(Function(user) user.Id = facultyId))
    gvAssociatedUsers.DataBind()
    upAssociatedFaculty.Update()
End Sub

Protected Sub btnAddUser_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnAddUser.Click
    facultyId = New Guid(ddlFacultyList.SelectedValue)
    associatedFaculty.Add(facultyList.Find(Function(user) user.Id = facultyId))
    gvAssociatedUsers.DataBind()
    upAssociatedFaculty.Update()
End Sub

标记:

<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<asp:UpdatePanel ID="upAssociatedFaculty" runat="server" 
    UpdateMode="Conditional">
    <ContentTemplate>
<p><b>Created By:</b> <asp:Label ID="lblCreatedBy" runat="server"></asp:Label></p>
<p><b>Accomplishment Type: </b><asp:DropDownList ID="ddlAccomplishmentType" runat="server"></asp:DropDownList></p>

        <p><b>Accomplishment Applies To: </b><asp:DropDownList ID="ddlFacultyList" runat="server"></asp:DropDownList>
            &nbsp;<asp:Button ID="btnAddUser" runat="server" Text="Add Faculty" /></p>

        <p>
            <asp:GridView ID="gvAssociatedUsers" runat="server" AutoGenerateColumns="false" 
                GridLines="None" ShowHeader="false">
                <Columns>
                     <asp:BoundField DataField="Id" HeaderText="Id" Visible="False" />
                     <asp:TemplateField ShowHeader="False">
                         <ItemTemplate>
                             <span style="margin-left: 15px;">
                                <p><%#Eval("LastName")%>, <%#Eval("FirstName")%>
                                <asp:Button ID="btnUnassignUser" runat="server" CausesValidation="false" 
                                     CommandArgument='<%# Eval("Id") %>' CommandName="Delete" OnCommand="deleteUser" Text='Remove' /></p>
                             </span>
                         </ItemTemplate>
                     </asp:TemplateField>
                 </Columns>
                 <EmptyDataTemplate>
                     <em>There are currently no faculty associated with this accomplishment.</em>
                 </EmptyDataTemplate>
            </asp:GridView>
        </p>
    </ContentTemplate>
</asp:UpdatePanel>

现在我认为更新面板的意义在于能够更新其中的内容,而无需执行完整的 post_back 并重新加载页面。那么如果是这样的话,为什么每次我点击按钮时它都会调用 page_load 呢?我运行了这段代码并进行了调试,我发现即使在任何与按钮按下相关的代码触发之前,page_load 也会再次运行。

我尝试将gvAssociatedUser.Datasource = associatedFaculty 和下面的行放在Page.IsPostBack 检查中,这会阻止页面工作。我尝试了 ChildrenAsTriggers 和 UpdateMode 的更新面板设置的每种组合,但都没有奏效。

我知道这很简单,但我尝试过的所有组合都无法让它发挥作用。我怎样才能让这件事发挥作用?

已编辑:它没有导致完整的回发,所以我的原因是错误的。我认为该页面正在执行完整的回发,从而重置了我的关联教师列表全局变量,但它没有执行完整的回发。

我遇到的问题是每次单击btnAddUser 时,它都会向associatedFaculty 列表添加一个元素,从而绑定到gvAssociatedusers。这第一次有效,但第二次单击它时,它会覆盖第一个元素。因此,每次单击按钮时,我的相关教员列表似乎都会被重置?

【问题讨论】:

    标签: .net vb.net button updatepanel postback


    【解决方案1】:

    Welp 我找到了答案:

    即使在部分回发时,整个页面类也被销毁并重新创建,因此所有全局变量都被再次调用,因此 New() 变量将为空,因此只能保存一项。我的想法是错误的,因为它在 UpdatePanel 中,因此与该数据相关的内容将通过回发持续存在。

    除非存储在 ViewState 或 Session 中,否则不会通过回发保留任何内容。

    【讨论】:

      【解决方案2】:

      您确定它会进行“完整”回发吗?

      你提到的帖子有一个非常简单的测试方法..

      <script type="text/javascript">
         var count=0;
          function incrementCounter()
          {
              count ++;
              alert(count);
          }
      </script>
      

      然后在你的 asp 按钮上添加这个

      OnClientClick="incrementCounter();"
      

      如果您进行完整的回帖,您的警报应该始终显示“1”...

      如果您的值正确增加,那么您将获得预期的 ajax 功能。

      【讨论】:

      • 好吧我错了,它没有做一个完整的回发,通过你的方法测试。所以这不是导致问题的原因,我遇到的问题是每次单击btnAddUser 时我的关联教员列表都会被重置。所以我可以在第一次单击它时将一个人添加到gridview(并删除它没问题),但是当我第二次单击它时,它只会覆盖第一个,而不是添加到它。更新了原始帖子以更清晰。
      猜你喜欢
      • 2021-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多