我如何 运行 我的 Javascript OnClientClick 和 C# OnClick 没有回发?

How can I run my Javascript OnClientClick and C# OnClick without postback?

我有一个 div 在我的母版页中用作弹出窗口,名为 'mydiv-clear'。
我的主页内容在 div 'fade' 中。

如果我在 "return false;" 中使用 "return false;",我可以使用 Javascript OnClientClick 成功 "popup" 我的 div(将显示从 none 更改为阻止) OnClientClick 以防止回发(div 在回发时返回到 display:none)。

我想执行 C# OnClick 控件以获得弹出窗口中的额外功能。当我 return=false;在我的 OnClientClick 中,我无法点击我的 C# OnClick 代码。当我删除 return=false;我的页面被回传,我的显示又回到了 display=none;。在线解决方案建议将我的按钮移动到 UpdatePanel 控件或使用 UseSubmitBehaviour=false,但这些都不适合我。

当我突破我的代码时,下面的解决方案将触发我的 javascript(弹出窗口出现)导致回发(弹出窗口消失)并触发我的 C#。有人可以建议一种方法来防止回发并仍然触发 C# 吗?谢谢

.Net

<asp:Button ID="btnOptOut" OnClientClick="div_show();" UseSubmitBehavior="false" OnClick="btnOptOut_Click" CssClass="btn btn-default" runat="server" Text="Opt Out" />

C#

protected void btnOptOut_Click(object sender, EventArgs e)
            {

                try
                {

                    _dal.createOptOutRecord(_myuser.id, _myuser.EmailAddress);

                    //More functionality to go here

                }

                catch(Exception ex)
                {


                }
            }

Javascript

 function div_show() {
    document.getElementById('mydiv-clear').style.display = "block";
    document.getElementById('fade').style.opacity = ".1";
}

回发将始终在按钮 OnClick 事件上执行。即使它在 UpdatePanel 中,它仍然会执行(部分)回发。但是只要 div 在外面,UpdatePanel 仍然可以工作。

但是有多种方法可以保持 div 的可见性。第一个示例使用 RegisterStartupScript

    protected void btnOptOut_Click(object sender, EventArgs e)
    {
        //call the div_show() function again after postback
        ScriptManager.RegisterStartupScript(Page, Page.GetType(), "showDiv", "div_show()", true);
        //or set the visibility directly to the div after postback
        ScriptManager.RegisterStartupScript(Page, Page.GetType(), "showDiv", "document.getElementById('mydiv-clear').style.display = \"block\";", true);
    }

第二个例子使用全局变量。

    public string divVisibility = "none";
    protected void btnOptOut_Click(object sender, EventArgs e)
    {
        divVisibility = "block";
    }

然后在 .aspx 文件中

    <div id="mydiv-clear" style="display: <%= divVisibility %>">myDiv</div>

.aspx 页面中带有 UpdatePanel 的第三个示例。

<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true"></asp:ScriptManager>

<asp:UpdatePanel ID="UpdatePanel3" runat="server">
    <ContentTemplate>
        <asp:Button ID="btnOptOut" OnClientClick="div_show();" UseSubmitBehavior="false" OnClick="btnOptOut_Click" CssClass="btn btn-default" runat="server" Text="Opt Out" />
        <asp:Label ID="Label1" runat="server" Text="Does it work?"></asp:Label>
    </ContentTemplate>
</asp:UpdatePanel>

<div id="mydiv-clear" style="display: none">myDiv</div>

然后在代码隐藏中。

    protected void btnOptOut_Click(object sender, EventArgs e)
    {
        Label1.Text = "Yes it does!";
    }