javascript - __DoPostback 在执行部分回发时回发禁用控件的值

标签 javascript asp.net ajax asp.net-ajax webforms

我有一个表单,为了隔离问题,它有大约一打纯 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>

重现步骤:

  1. 打开 Fiddler 和测试页面。
  2. 单击“在 UpdatePanel 外部提交”(触发正常回发)。请注意,在 Fiddler 中,值 "foo=on" 在 POST 正文中提交。
  3. 点击“切换复选框”以禁用复选框。
  4. 再次单击“在 UpdatePanel 外部提交”。请注意参数 "foo" 从 POST 主体中省略。这是预期的。
  5. 单击“在 UpdatePanel 内提交”(触发部分回发)。请注意值 "foo=on" 出现在 POST 正文中,即使它应该被省略

该错误似乎存在于 MicrosoftAjaxWebForms.jsMicrosoftMvcAjax.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/

相关文章:

php - 使用 AJAX 和 PHP 上传文件出现未知错误(BIF jQuery 插件)

c# - 为什么我的带有多个参数的 asp mvc ajax GET 请求不起作用?

javascript - 如何隐藏 Jquery 中已使用 .load 函数加载的元素

javascript - 证明行中图像的对齐方式(ala Google Images)

javascript - 自定义元素继承

c# - 如何在 XDocument.Load 中使用相对路径?

asp.net - CSS 样式表没有反射(reflect)在我的 aspx 上

javascript - 如何使用多个 AngularJS 嵌套/相关 Controller

JavaScript 数组在循环外是正确的,但循环内未定义

.net - 使用 "right".NET Framework 版本