Список очищается при каждом нажатии кнопки внутри панели обновления? - PullRequest
0 голосов
/ 22 апреля 2010

Нет, это не копия этого вопроса: Кнопка на панели обновления выполняет полную обратную передачу?

У меня есть выпадающий список на панели обновлений, и я пытаюсь получить его, чтобы человек, использующий страницу, мог добавлять пользователей в список, связанный с сеткой. Список является глобальной переменной, и на 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

Markup:

<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. Это работает в первый раз, но во второй раз, когда я нажимаю на него, он перезаписывает первый элемент. Похоже, мой список связанных с ним сбрасывается каждый раз, когда я нажимаю кнопку?

Ответы [ 2 ]

2 голосов
/ 23 апреля 2010

Welp Я узнал ответ на этот вопрос:

Даже при частичной обратной передаче весь класс страницы уничтожается и создается заново, поэтому все глобальные переменные вызываются снова, поэтому переменные New () будут пустыми, поэтому можно сохранить только один элемент. Я был не прав, полагая, что, поскольку это было в UpdatePanel, то, что было там и связано с этими данными, сохранится через обратную передачу.

Ничего не сохраняется через обратные передачи, если они не сохранены в ViewState или Session.

1 голос
/ 22 апреля 2010

Вы уверены, что он выполняет "ПОЛНУЮ" обратную передачу?

Упомянутый вами пост имеет довольно простой способ тестирования ..

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

и нажмите кнопку asp, добавив это

OnClientClick="incrementCounter();"

Если вы делаете полный пост обратно, ваше предупреждение должно всегда показывать "1" ...

Если ваше значение увеличивается должным образом, тогда вы получаете ожидаемую функциональность AJAX.

...