I’ve got an ASP.NET UpdatePanel with the following:
<asp:UpdatePanel ID="UpdatePanel3" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<%-- jQuery dialog - Suppliers --%>
<div id="divSuppliers" style="display: none;">
<asp:ListBox ID="lstSuppliers" runat="server" SelectionMode="Single" Rows="10" Width="100%"
DataValueField="SupplierID" DataTextField="SupplierName">
</asp:ListBox>
<br /><br />
<asp:Button ID="btnSelectSupplier" runat="server" Text="Select 2" OnClick="btnSelectSupplier_Click" />
</div>
<asp:GridView ID="gvSuppliers" runat="server" AutoGenerateColumns="false" SkinID="gvSkin"
DataKeyNames="SupplierID" EmptyDataText="No Existing User Roles">
<Columns>
<asp:TemplateField HeaderText="Supplier Name">
<ItemTemplate>
<asp:Label ID="lblSupplierName" runat="server" Text='<%# Eval("SupplierName") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<asp:Button ID="btnAddSupplier" runat="server" Text="Add Supplier"
Visible="false" OnClick="btnAddSupplier_Click" />
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="btnSelectSupplier" />
</Triggers>
</asp:UpdatePanel>
Quite simple, really. Nothing more than a div that I use for my jQuery Dialog popup, an ASP.NET GridView control with a single column, and an ASP.NET button for asynchronous postbacks.
Here is the click event that handles the asynchronous postback for btnSelectSupplier.
protected void btnSelectSupplier_Click(object sender, EventArgs e) {
// +=+=+=+=+=+=+=+=+=+=+=+=+=+=
// WORKS JUST FINE
List<SupplierItem> suppliers = new List<SupplierItem>();
foreach (int i in lstSuppliers.GetSelectedIndices()) {
suppliers.Add(
new SupplierItem { SupplierID = Convert.ToInt32(lstSuppliers.Items[i].Value), SupplierName = lstSuppliers.Items[i].Text });
lstSuppliers.Items[i].Selected = false;
}
gvSuppliers.DataSource = suppliers;
gvSuppliers.DataBind();
// +=+=+=+=+=+=+=+=+=+=+=+=+=+=
// DOES NOT WORK!!
string jq = "$('#divSuppliers').dialog('close');";
ScriptManager sm = ScriptManager.GetCurrent(this);
if (sm != null && sm.IsInAsyncPostBack) {
ScriptManager.RegisterClientScriptBlock(
this, typeof(Page), Guid.NewGuid().ToString(),
jq, true);
}
}
PROBLEM:
The GridView will update just fine during the asynchronous postback (see the click event above); however, the jQuery Dialog refuses to close (again, see event above and where it says DOES NOT WORK). I’m registering the javascript (jquery) with the ScriptManager on the page and so it should be executing and closing the dialog, but for some reason it doesn’t.
EDIT:
Code that opens the jQuery dialog and makes it modal.
protected void btnAddSupplier_Click(object sender, EventArgs e) {
lstSuppliers.ClearSelection();
lstSuppliers.DataSource = Suppliers.GetAllSuppliers();
lstSuppliers.DataBind();
string jq = "var dlg = $('#divSuppliers').dialog({ modal: true, draggable: true, title: 'Suppliers', width: 500 }); dlg.parent().appendTo($('form:first'));";
ScriptManager sm = ScriptManager.GetCurrent(this);
if (sm != null && sm.IsInAsyncPostBack) {
ScriptManager.RegisterClientScriptBlock(
this, typeof(Page), Guid.NewGuid().ToString(),
jq, true);
}
}
The div used for jQuery UI Dialog should be outside the UpdatePanel.
On
btnAddSupplier_Clickyou create dialog and move it outside the UpdatePanel.After
btnSelectSupplier_Clickyou have 2 divs with divSuppliers id, the moved one and the one received from server (UpdatePanel mechanism allows partial page updates by rebuilding the entire UpdatePanel DOM with html returned from the server).I would also suggest to use console.log to help with debugging.
Add to closing dialog js:
console.log($('#divSuppliers'))