TL;DR: 如果在没有选择 ListBox 的情况下单击 Edit 按钮,触发验证失败,为什么Delete
需要在浏览器响应之前单击两次链接?
使用下面的源代码作为一个非常简单的菜单,我有三个链接:
New
- 不执行验证并重定向到“创建”表单Edit
- 检查是否选择了 ListItem,如果是,则重定向到“编辑”表单,并使用作为参数提供的 ID 值Delete
- 重定向到“删除”页面,无论是否做出选择
我注意到一个奇怪的行为,并在这个简单的单页解决方案中重现(从 OneDrive 下载链接):
- 加载页面
- 单击
Edit
而不从 ListBox 中进行选择(出现验证错误) - 点击
Delete
- 没有任何反应 - 为什么? - 点击
Delete
- 服务器端重定向成功发生,但这应该发生在上面的第 3 步
以下是我的浏览器中发生的情况(在 Chrome、FF 和 Edge 中测试) - 请注意,需要在删除链接上单击两次:
更新
问题似乎在 ASP.Net 的表单提交代码中:
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
// On first click - this logic path is never reach, but on the second click, it is reached
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}
在我if
手动调用Page_ClientValidate()
.
代码
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication1.WebForm1" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Test Page</title>
<script>
function RedirectToPageWithSelectedId() {
if (Page_ClientValidate("mustSelect")) { // Asp.Net client-side validation, passing ValidationGroup as parameter
var li = $("#<%=ListBox1.ClientID%> option:selected");
var i = li.val();
if (parseInt(i) != NaN) {
window.location.href = "/edit/" + i;
}
}
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<p>
<asp:ListBox ID="ListBox1" runat="server" />
<asp:RequiredFieldValidator ID="Rfv1" runat="server" Text="Selection required" ValidationGroup="mustSelect" ControlToValidate="ListBox1" Display="Dynamic" />
</p>
<ul>
<li>
<asp:HyperLink ID="lnk_new" runat="server" Text="New" NavigateUrl="~/new" />
</li>
<li>
<asp:HyperLink ID="lnk_edit" runat="server" Text="Edit Selected" onclick="RedirectToPageWithSelectedId(); return false;" href="#" />
</li>
<li>
<asp:LinkButton ID="lnk_delete" runat="server" Text="Delete" />
</li>
</ul>
</div>
</form>
</body>
</html>
如果需要,我可以更新以提供页面的代码隐藏;问一下。