OnclientClick和OnClick不能同时工作?

stc*_*flw 55 c# asp.net postback onclick onclientclick

我有一个如下按钮,

<asp:Button ID="pagerLeftButton" runat="server" OnClientClick="disable(this)" onclick="pager_Left_Click" Text="<" />
Run Code Online (Sandbox Code Playgroud)

当我使用我的按钮时,onclick不会触发.当我删除OnClientClick时,然后触发onclick.

我需要做的是,在回发期间禁用按钮并在回发结束后启用它.

编辑:附加信息:

我添加了断点,我的触发功能是c#部分,我正在调试,他们肯定没有开火.那些功能就像

protected void pager_Left_Click(object sender, EventArgs e)
{
//Do smthing.
}
protected void pager_Right_Click(object sender, EventArgs e)
{
//Do smthing.
}
Run Code Online (Sandbox Code Playgroud)

当我点击我的按钮时,它被禁用1-2秒并自动启用,但我不确定为什么它被启用.我没有添加任何部分,以便再次启用它.

Vin*_*dey 98

来自web.archive.org上的这篇文章:

诀窍是使用按钮控件的OnClientClick和UseSubmitBehavior属性.还有其他方法,包括在服务器端添加属性的代码,但我认为这样做的简单性更有吸引力:

<asp:Button runat="server" ID="BtnSubmit"  OnClientClick="this.disabled = true; this.value = 'Submitting...';"   UseSubmitBehavior="false"  OnClick="BtnSubmit_Click"  Text="Submit Me!" />
Run Code Online (Sandbox Code Playgroud)

OnClientClick允许您添加客户端OnClick脚本.在这种情况下,JavaScript将禁用button元素并将其文本值更改为progress消息.回发完成后,新呈现的页面将使按钮恢复其初始状态,而无需任何额外的工作.

在客户端禁用提交按钮带来的一个缺陷是它将取消浏览器的提交,从而取消回发.将UseSubmitBehavior属性设置为false会使.NET注入必要的客户端脚本以终止回发,而不是依赖于浏览器的表单提交行为.在这种情况下,它注入的代码将是:

__doPostBack('BtnSubmit','')
Run Code Online (Sandbox Code Playgroud)

这将添加到我们的OnClientClick代码的末尾,为我们提供这个呈现的HTML:

<input type="button" name="BtnSubmit"  onclick="this.disabled = true; this.value ='Submitting...';__doPostBack('BtnSubmit','')"  value="Submit Me!" id="BtnSubmit" />
Run Code Online (Sandbox Code Playgroud)

这提供了一个很好的按钮禁用效果和处理文本,同时回发完成.

  • 这是正确的答案.您应该编辑您的答案以包含文章中的信息.(`UseSubmitBehavior = "假"`) (6认同)

Gaʀ*_*ʀʀʏ 13

与OnClick一起使用时,OnClientClick似乎非常挑剔.

我尝试使用以下用例失败:

OnClientClick="return ValidateSearch();" 
OnClientClick="if(ValidateSearch()) return true;"
OnClientClick="ValidateSearch();"
Run Code Online (Sandbox Code Playgroud)

但他们没有工作.以下工作:

<asp:Button ID="keywordSearch" runat="server" Text="Search" TabIndex="1" 
  OnClick="keywordSearch_Click" 
  OnClientClick="if (!ValidateSearch()) { return false;};" />
Run Code Online (Sandbox Code Playgroud)

  • 我不太清楚为什么,但只有这对我有用! (4认同)

小智 6

Vinay(上图)提供了有效的解决方案. 实际上导致按钮的OnClick事件在OnClientClick事件函数之后无法工作的原因是MS已将其定义在哪里,一旦按钮被禁用(在OnClientClick事件调用的函数中),按钮"通过不尝试完成"来"尊重"通过调用OnClick事件的已定义方法来调用按钮的活动.

我花了几个小时试图解决这个问题.一旦我删除了语句以禁用提交按钮(在OnClientClick函数内),就调用了OnClick方法,没有进一步的问题.

微软,如果你正在听,一旦点击按钮,它应该完成它的已分配活动,即使它在此活动的一部分被禁用.只要在单击时未禁用它,它就应该完成所有已分配的方法.


Sam*_*Sam 6

这里有两个问题:

禁用客户端上的按钮可防止回发

要解决此问题,请在JavaScript 事件禁用该按钮onclick.一个简单的方法是setTimeout按照这个答案的建议使用.

此外,OnClientClick即使ASP.NET验证失败,代码仍会运行,因此添加检查可能是个好主意Page_IsValid.这可确保在验证失败时不会禁用该按钮.

OnClientClick="(function(button) { setTimeout(function () { if (Page_IsValid) button.disabled = true; }, 0); })(this);"
Run Code Online (Sandbox Code Playgroud)

如问题所示,将所有这些JavaScript代码放在自己的函数中更为简洁:

OnClientClick="disable(this);"

function disable(button) {
    setTimeout(function () {
        if (Page_IsValid)
            button.disabled = true;
    }, 0);
}
Run Code Online (Sandbox Code Playgroud)

禁用客户端上的按钮不会在服务器端禁用它

要解决此问题,请禁用服务器端的按钮.例如,在OnClick事件处理程序中:

OnClick="Button1_Click"

protected void Button1_Click(object sender, EventArgs e)
{
    ((Button)sender).Enabled = false;
}
Run Code Online (Sandbox Code Playgroud)

最后,请记住,防止重复按下按钮不会阻止两个不同的用户同时提交相同的数据.确保在服务器端考虑到这一点.

  • 下来的选民可以让我知道什么是错的吗?如果我错了,我想知道,所以我可以删除这个答案,并从我的错误中吸取教训.或者,如果您只是不理解我的代码或其背后的原因,请询问.在后一种情况下,你通过低调投票给好的建议对社区造成伤害. (10认同)