さらに処理するためにモーダル ダイアログ WebForm2 (OpenForm2() js 関数を介して) を開く ASP.NET ページ (WebForm1) があります。ダイアログを閉じると、JavaScript を介して UpdatePanel を更新するだけです。問題は、この js 呼び出し中に UI がブロックされないことです。
これは、サーバー側 (Button1_Click) から OpenForm2 js メソッドを呼び出している場合にのみ発生します。UI は既にブロック モードになっているため、WebForm2 を閉じると、部分的なポストバック (JavaScript) の完了を待たずに UI のブロックが解除されます。
ボタン (サンプルのボタン 2) の OnClientClick タグで OpenForm2 js 関数を直接呼び出すと、うまく機能し、ポストバックが完了するまで UI をブロックし続けます。
部分的なポストバック js コードを add_endRequest にラップしようとしましたが、その場合、refreshUpdatePanel() js メソッドを呼び出し続けるため、UI のブロック/ブロック解除が続行されます。その場合、ページで使用される 2 つの add_endRequest が原因で、これが発生する可能性はありますか?
この点に関して、どんな支援も高く評価されます。
注: 部分的なポストバック中にページをブロックするために jQuery blockUI を使用しました。
WebForm1 ページのコード サンプルは次のとおりです。(WebForm2 aspx ページには、ダイアログを閉じるボタンと関連する js 関数しかありません)。
WebForm1.aspx
<head runat="server">
<title></title>
<script src="js/jquery-1.6.1.min.js" type="text/javascript"></script>
<script src="js/jquery.blockUI.js" type="text/javascript"></script>
<script type="text/javascript">
function OpenForm2() {
var url = "WebForm2.aspx";
var width = 950;
var height = 455; // screen.availHeight - (120 + 65);
// open modal dialog
obj = window.showModalDialog(url, window, "dialogWidth:" + width + "px; dialogHeight:" + height + "px; center:yes");
// partial postback to reflect the changes made by form2
refreshUpdatePanel();
//Sys.WebForms.PageRequestManager.getInstance().add_endRequest(refreshUpdatePanel);
// ** here it doesn't wait for the completion and unblocks the UI **
}
function refreshUpdatePanel() {
//window.__doPostBack('UpdatePanel1', '1');
// a timeout/delay before a client side updatepanel postback. That compelled the UI to go in blocking again with a little screen flickering.
setTimeout('__doPostBack("<%= UpdatePanel1.ClientID %>", "1")', 0);
}
$(document).ready(function () {
var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_initializeRequest(InitializeRequest);
prm.add_endRequest(EndRequest);
$.blockUI.defaults.css = {};
function InitializeRequest(sender, args) {
// Whatever you want to happen when the async callback starts
$.blockUI();
}
function EndRequest(sender, args) {
// Whatever you want to happen when async callback ends
$.unblockUI();
}
});
</script>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<asp:Label ID="Label1" runat="server" Text=""></asp:Label>
<asp:UpdatePanel ID="UpdatePanel1" runat="server" OnLoad="UpdatePanel1_Load">
<ContentTemplate>
<asp:Label ID="Label2" runat="server" Text=""></asp:Label><br />
<asp:Button ID="Button1" runat="server" Text="Button 1" OnClick="Button1_Click" />
<asp:Button ID="Button2" runat="server" Text="Button 2" OnClientClick="OpenForm2();return false;" />
</ContentTemplate>
</asp:UpdatePanel>
</form>
</body>
WebForm1.aspx.cs
protected void Button1_Click(object sender, EventArgs e)
{
// some server side processing here
System.Threading.Thread.Sleep(1000);
// then calling javascript function to open form2 as modal
ScriptManager.RegisterClientScriptBlock(UpdatePanel1, UpdatePanel1.GetType(), "Button1Click", "OpenForm2();", true);
}
protected void UpdatePanel1_Load(object sender, EventArgs e)
{
string parameter = Request["__EVENTARGUMENT"];
if (parameter == "1")
{
System.Threading.Thread.Sleep(3000);
Label2.Text = DateTime.Now.ToString();
}
}