【问题标题】:OnClick and OnClientClickOnClick 和 OnClientClick
【发布时间】:2011-05-30 11:28:44
【问题描述】:

我在另一个页面打开的弹出页面上有一个图像按钮

<asp:ImageButton 
        ID="Button_kalem_islemikaydet" 
        runat="server" 
        CausesValidation="False" 
        ImageUrl="~/images/butonlar/buyuk/Kaydet.jpg"  
        meta:resourcekey="Button_kalem_islemikaydetResource1" 
        OnClick="Button_ust_islemikaydet_Click" 
        OnClientClick="f2()"  
        Width="100" />

f2()

<script type="text/javascript">
        function f2() {
            opener.document.getElementById("TextBox1").value = "hello world";
            opener.document.getElementById("HiddenField1").value = "hello world";

            window.opener.location.href = window.opener.location.href;            
        } 
</script> 

Button_ust_islemikaydet_Click 是在 aspx.cs 文件中实现的另一种方法,它更新在 GridView 的父页面中显示的数据库表。

我要做的是做PostBack,我的意思是刷新打开器(父)页面。上面的代码刷新工作正常。但是,父页面在刷新之前仍然显示相同的数据。原因是OnClientClickOnClick 方法之前工作 所以我的问题是,有什么方法可以在OnClick 上运行该方法并完成它,然后运行OnClientClick 方法?

【问题讨论】:

    标签: c# javascript asp.net dopostback onclientclick


    【解决方案1】:
    <form id="aspnetForm" runat="server">
        <asp:Button Text="Click Me" ID="ClickMeButton" OnClick="ClickMeButton_OnClick" runat="server" />
        <asp:HiddenField runat="server" ID="UpdateOpenerHiddenField" Value="false" />
    
        <script type="text/javascript">
            //1st approach
            var updateOpenerField = window.document.getElementById("<%= UpdateOpenerHiddenField.ClientID  %>");
            if (updateOpenerField.value === "true") {
                f2();
                updateOpenerField.value = "false";
            }
    
            // for the 2nd approach just do nothing
            function f2() {
                alert("Hello, opener!");
            }
    </script>
    </form>
    
    
    protected void ClickMeButton_OnClick(object sender, EventArgs e)
        {
            //1st approach
            UpdateOpenerHiddenField.Value = "true";
    
            // 2nd approach
            ClientScript.RegisterStartupScript(this.GetType(), "RefreshOpener", "f2();", true);
        }
    

    【讨论】:

    • 我尝试了第二种方法 Onestein 但它不起作用我现在将尝试第一种方法,谢谢。
    • 我想,导致回发的按钮放置在 UpdatePanel 中。如果是这样,那么您仍然可以使用第二种方法,但使用 ScriptManager 类而不是 Page.ClientScript 注册启动脚本: ScriptManager.RegisterStartupScript(this, this.GetType(), "RefreshOpener", "f2();", true) ;
    • 感谢 Onestein,它奏效了。因为你看起来很擅长这些事情,我想问另一个问题,我在两天前问过这个问题 Refresh GridView(only) in parent window with JavaScript。如果你有任何想法,我期待它问题,谢谢。
    【解决方案2】:

    不,您不能在客户端之前运行服务器端代码(OnClick 事件处理程序)。添加了 OnCLientClick 事件以在回发之前执行一些验证。只有一种方法可以做到——更新 f2 方法并通过 ajax 在服务器上发布数据

    【讨论】:

    • Ajax 没有那么复杂。使用jQuery框架,有很多很好的示例
    • 我会尝试,但在此之前你认为我是否可以在 aspx.cs 中使用 f2()RegisterClientScriptBlock 之类的?
    • 是的,你可以。但是浏览器会重新加载页面两次,第一次 - 将数据发布到服务器时,第二次 - 脚本刷新页面时
    【解决方案3】:

    您可以将您的 javascript 放入您在服务器端 OnClick 处理程序中显示的 PlaceHolder 标记中。

    aspx代码:

    <asp:PlaceHolder id="refreshScript" visible="false" runat="server">
      window.opener.location.href = window.opener.location.href;
      window.close();
    </asp:PlaceHolder
    

    cs代码:

    protected void button_Click(Object sender, EventArgs e) {
      // do whatever
      refreshScript.Visible = true;
    }
    

    【讨论】:

    • 这对雷有什么帮助?我很困惑。
    • 页面第一次加载时,占位符是不可见的,所以脚本没有渲染到页面上,所以什么也不做。单击后,您使占位符可见,脚本呈现到页面,因此它执行并重新加载开启器。我想它也应该关闭弹出窗口,所以我将其添加到我的答案中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-03
    • 2010-11-11
    • 1970-01-01
    相关资源
    最近更新 更多