何时调用服务器 onClick vs OnClientClick

when to call the Server onClick vs OnClientClick

本文关键字:vs OnClientClick onClick 服务器 调用 何时      更新时间:2023-09-26

有人可以解释为什么点击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>

TL;DR:删除UseSubmitBehavior="false"

更长的解释:

使用 UseSubmitBehavior 属性指定按钮控件是否 使用客户端浏览器的提交机制或 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 不是这种情况,它确实到达脚本并因此提交表单)。