有人可以解释为什么 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 不是这种情况,它确实到达了脚本并因此提交了表单)。