有人可以解释为什么 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"
更长的解释:



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

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

第二个是
"return onClientClick();__doPostBack('ctl00$MainContent$btnSaveFile2','')"

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

10-08 06:20