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

时间:2014-02-15 17:17:07

标签: c# javascript asp.net

我有一个名为sales的按钮,当我点击取消它回发并且表单中的值被插入时它有一个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 个答案:

答案 0 :(得分:1)

好的,有几个笔记给你:

  1. 在任何一种情况下都需要回发。

  2. 您的<asp:Button>会自动进行回发,因此您无需在此方案中致电__doPoskBack();

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


  4. 要解决此问题,

    首先:在用户取消时创建功能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()功能并将其(如果尚未安装)放入单独的&#34 ; yourScripts.js&#34;文件然后只需在使用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;
    }