【发布时间】: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>
<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