【发布时间】:2012-05-16 05:59:10
【问题描述】:
我有一个带有以下内容的 ASP.NET UpdatePanel:
<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>
很简单,真的。只不过是一个用于 jQuery 对话框弹出窗口的 div、一个带有单列的 ASP.NET GridView 控件,以及一个用于异步回发的 ASP.NET 按钮。
这里是处理 btnSelectSupplier 异步回发的 click 事件。
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);
}
}
问题: GridView 将在异步回发期间正常更新(参见上面的点击事件);但是,jQuery 对话框拒绝关闭(再次,请参阅上面的事件以及它说不工作的地方)。我正在页面上的 ScriptManager 中注册 javascript (jquery),因此它应该正在执行并关闭对话框,但由于某种原因它没有。
编辑: 打开 jQuery 对话框并使其成为模态的代码。
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);
}
}
【问题讨论】:
-
你能显示你的 jquery 代码吗?我可以解决这个问题...
-
唯一相关的 jQuery 包含在我上面的代码中(参见点击事件代码)。由于某种原因,对话框关闭不起作用 - 仅此而已。
-
您是否尝试过在 JS 控制台(如 Firebug 或 Safari/Chrome 的开发者控制台)中执行
$('#divSuppliers').dialog('close'); -
你的页面包含了 jQuery UI 库,对吧?
标签: jquery asp.net updatepanel