什么时候调用服务器onClick vs OnClientClick

时间:2013-12-17 18:57:57

标签: javascript asp.net

有人可以解释为什么单击 btnSaveFile1 onClientClick ()被调用,如果 onClientClick ()返回true,它会调用服务器但是如果 onClientClick()返回false,则不会调用服务器。我完全理解。

但为什么不是 btnSaveFile2 的情况呢?无论 onClientClick()返回什么,似乎永远不会调用服务器?

为什么返回false; 必须是内联的?

<asp:Button ID="btnSaveFile1" runat="server" Text="Save" OnClientClick="if(!onClientClick()){return false;}" OnClick="btnSaveFile_Click" UseSubmitBehavior="false" />


<asp:Button ID="btnSaveFile2" runat="server" Text="Save" OnClientClick="return onClientClick()" OnClick="btnSaveFile_Click" UseSubmitBehavior="false" />


 <script type="text/javascript">   
       function onClientClick() {
            if (CurrentMemberValidatedWindow()) {
                if (!ValidateForm()) {
                    return false;
                }
            }
            else {
                DeleteInvalidFiles();
                return false;
            }
            return true;
        }
 </script>

1 个答案:

答案 0 :(得分:2)

TL; DR:删除UseSubmitBehavior="false"

更长的解释:

  

使用UseSubmitBehavior属性指定是否使用Button控件   使用客户端浏览器的提交机制或ASP.NET回发   机制。默认情况下,此属性的值为true,从而导致   按钮控件使用浏览器的提交机制。 如果您指定   false,ASP.NET页面框架将客户端脚本添加到页面   将表单发布到服务器。

如果查看页面来源,呈现按钮的onclick不仅仅是"if(!onClientClick()){return false;}""return onClientClick();",因为它必须添加客户端脚本才能发布表单。所以现在第一个按钮就是:

"if(!onClientClick()){return false;};__doPostBack('ctl00$MainContent$btnSaveFile1','')"

,第二个是

"return onClientClick();__doPostBack('ctl00$MainContent$btnSaveFile2','')"

所以你可以看到#2,如果它返回true,它将无法到达实际提交表单的脚本。 (按钮1不是这种情况,它确实到达脚本并因此提交表单)。