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