gpt4 book ai didi

c# - 弹出窗口不会在 asp.net 中回发

转载 作者:行者123 更新时间:2023-11-28 01:33:31 25 4
gpt4 key购买 nike

我有一个名为“销售”的按钮,当我单击“取消”回发时,它有一个 JavaScript 弹出窗口,并且会插入表单中的值,但是当我单击“确定”时,它不会回发,并且表单中的值不会进入数据库(JavaScript按钮实际上是打印调用,当单击按钮时,它会要求打印,当打印对话框打开时,它不会回发,并且数据不会插入数据库中)

这是 JavaScript 代码

function confirmAction(printable) {
var r = confirm("You want to Print Invoice?");
if (r == true) {
var printContents = document.getElementById(printable).innerHTML;
var originalContents = document.body.innerHTML;

document.body.innerHTML = printContents;

window.print();

document.body.innerHTML = originalContents;

__doPostBack();
}
else {
__doPostBack();
}
}

这是按钮点击的代码

 <asp:Button ID="btnaddsale" runat="server" Text="Sale" OnClick="btnaddsale_Click"  OnClientClick="javascript:confirmAction('printable')"/>

最佳答案

好的,给您一些注意事项:

  1. 无论哪种情况,您都需要回发。

  2. 您的<asp:Button>无论哪种方式都会自动进行回发,因此您无需调用 __doPoskBack();在这种情况下。

  3. 这里的主要问题是,如果您想要回发,它将在函数退出时立即发生,从而有效地过早取消打印对话框。为了避免这种情况,我们将使用 JavaScript技巧将检查 document 是否有focus ,并且只有当它发生时(当用户退出浏览器中的打印对话框时)我们才会返回并允许回发发生。

<小时/>

要解决此问题,

首先:创建函数 return true;当用户取消时,等待 focus然后return true如果用户想要打印:

function confirmAction(printable) {
var r = confirm("You want to Print Invoice?");
if (r == true) {
var printContents = document.getElementById(printable).innerHTML;
var originalContents = document.body.innerHTML;

document.body.innerHTML = printContents;

window.print();

document.body.innerHTML = originalContents;

// Check focus after user exits print dialog and then return true for the postback
var document_focus = false;
$(document).focus(function () { document_focus = true; });
setInterval(function () { if (document_focus === true) { return true; } }, 500);
}
else {
return true;
}
}

然后,更改 JavaScript使用 return 的代码OnClientClick 中的声明事件:

<asp:Button ID="btnaddsale" runat="server" Text="Sale" 
OnClick="btnaddsale_Click"
OnClientClick="javascript:return confirmAction('printable')"/>

根据评论和您更改的要求进行更新:

这是一个使脚本在回发后弹出的代码片段。因此,您将向数据库插入值,然后使用Page.ClientScript.RegisterStartupScript()在页面加载时添加打印脚本/确认对话框。

注意,我不建议将脚本嵌入到您的 C# 代码中,因此我建议采用您的 confirmAction()函数并将其(如果还没有)放入单独的“yourScripts.js ”文件中,然后在使用 jQuery 加载页面时调用函数名称。这是一个例子:

在您的母版页或页眉中:此文件应包含 confirmAction()功能

<script type="text/javascript src="path/to/yourScriptsFile.js">

然后,在代码隐藏中:

protected void Page_Load(object sender, EventArgs e)
{
// Only display script on PostBack, not initial page load
if (IsPostBack)
{
Page.ClientScript.RegisterStartupScript(
this.GetType(),
"confirmAction",
@"<script type=""Text/Javascript"">$(document).ready(function() { confirmAction('printable'); });</script>");
}
}

另请注意,由于您现在不需要回发,因此 confirmAction功能不应再return true;或者使用我上面发布的技巧代码,并且只会 return false :

function confirmAction(printable) {
var r = confirm("You want to Print Invoice?");
if (r == true) {
var printContents = document.getElementById(printable).innerHTML;
var originalContents = document.body.innerHTML;

document.body.innerHTML = printContents;

window.print();

document.body.innerHTML = originalContents;
}
return false;
}

关于c# - 弹出窗口不会在 asp.net 中回发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21800918/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com