我有一个表单,为了隔离问题,它有大约一打纯 HTML 复选框(不是 WebControls),所有这些都禁用。它们位于 UpdatePanel
中。
我有一个调用的链接
__doPostBack('a-control','my-custom-argument');
根据我提供的第一个参数,页面可能会执行完整的回发
或部分回发。
当我执行完整的回发
时,没有任何复选框值在帖子中提交(因为它们被禁用)。这是正常,因此也是期望的行为。
但是,当它执行部分回发
时,脚本会从我的复选框中收集所有值并提交它们,但不会指示哪些已被禁用,这会破坏我的代码。
这很烦人,我希望它的行为始终如一。无论如何告诉 .NET javascript 处理程序以世界其他地方的方式工作,不回发
禁用 HTML 表单的值元素?
最佳答案
在我看来像是一个错误。根据this禁用的输入不应与表单一起提交。
这是我的完整测试页面:
<%@ Page Language="C#" AutoEventWireup="true" Inherits="System.Web.UI.Page" EnableViewState="false" EnableEventValidation="false" Trace="false" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>Test disabled checkboxes</title>
<script>
initState = false;
function disableCheckboxes(disabled) {
document.getElementById('foo').disabled = disabled;
}
</script>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager runat="server" />
<asp:UpdatePanel runat="server">
<ContentTemplate>
<input runat="server" type="checkbox" id="foo" name="foo" checked="checked" /> Foo
<asp:Button ID="Inside" runat="server" Text="Submit Inside UpdatePanel" />
</ContentTemplate>
</asp:UpdatePanel>
<asp:Button ID="Outside" runat="server" Text="Submit Outside UpdatePanel" />
<br />
<button type="button" onclick="disableCheckboxes(initState=!initState)">Toggle checkboxes</button>
</form>
</body>
</html>
重现步骤:
- 打开 Fiddler 和测试页面。
- 单击“在 UpdatePanel 外部提交”(触发正常回发)。请注意,在 Fiddler 中,值
"foo=on"
在 POST 正文中提交。 - 点击“切换复选框”以禁用复选框。
- 再次单击“在 UpdatePanel 外部提交”。请注意参数
"foo"
从 POST 主体中省略。这是预期的。 - 单击“在 UpdatePanel 内提交”(触发部分回发)。请注意值
"foo=on"
出现在 POST 正文中,即使它应该被省略
该错误似乎存在于 MicrosoftAjaxWebForms.js
和 MicrosoftMvcAjax.js
(以及 .debug
每个的对应物):
if ((type === 'text') ||
(type === 'password') ||
(type === 'hidden') ||
(((type === 'checkbox') || (type === 'radio')) && element.checked)) {
formBody.append(encodeURIComponent(name));
formBody.append('=');
formBody.append(encodeURIComponent(element.value));
formBody.append('&');
}
被序列化的元素的 disabled
属性被完全忽略,这违背了表单提交实现的规范和实际行为。
关于javascript - __DoPostback 在执行部分回发时回发禁用控件的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1435403/