我有一个asp.net应用程序有单页(x.aspx)。这是一些文本框,无线电等等和一个按钮。单击按钮,我需要先调用一个web api将数据保存到数据库中,然后关闭页面。请注意,此页面不会弹出。如果我在page_load上放置RegisterOnSubmitStatement,它会关闭页面,但点击按钮不会触发。我尝试了RegisterclientScriptBlock,RegisterStartupScript但它们都不起作用。
请建议如何解决此问题。感谢。
答案 0 :(得分:0)
protected void Page_Load(object sender, EventArgs e)
{
//Save data here and after that execut script
Page.ClientScript.RegisterOnSubmitStatement(typeof(Page), "closePage", "window.onunload = CloseWindow();");
}
答案 1 :(得分:0)
方法1
您可以在按钮单击事件处理程序中使用RegisterStartupScript
注册结束代码。在服务器上完成处理后,该代码将在客户端执行:
protected void btnSaveData_Click(object sender, EventArgs e)
{
// Save data to database
...
ClientScript.RegisterStartupScript(Page.GetType(), "ClosePage", "window.close();", true);
}
方法2
您可以在延迟后尝试关闭页面:
<asp:Button runat="server" OnClientClick="setTimeout(function () { window.close(); }, 1000);" ... />
在此示例中,页面将在一秒钟(1000毫秒)后关闭。您可以调整延迟以满足您的需求。
方法3
此方法确保在数据保存方法完成之前窗口未关闭。
在触发保存过程的按钮单击上,启动间隔计时器以向服务器发送定期AJAX请求。当服务器的响应确认数据已保存时,请关闭窗口。
<asp:Button ID="btnSaveData" runat="server" OnClientClick="checkIsDataSaved()" ... />
function checkIsDataSaved() {
var interval = setInterval(function () {
$.get('', 'isDataSaved', function (data) {
if (data == "done") {
// The data has been saved, close the window
clearInterval(interval);
window.close();
}
});
}, 1000); // Every 1000 ms
}
在代码隐藏中,在保存数据后在Session变量中设置一个标志:
protected void SaveDataMethod()
{
// Save to database
...
Session["DataSaved"] = true;
Response.End();
}
在Page_Load
中,收到AJAX请求并发送结果:
protected void Page_Load(object sender, EventArgs e)
{
if (Request.QueryString.ToString() == "isDataSaved")
{
bool isDataSaved = Session["DataSaved"] != null && (bool)Session["DataSaved"];
Session["DataSaved"] = false;
Response.ClearContent();
Response.Write(isDataSaved ? "done" : "saving");
Response.End();
return;
}
...
}