You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET MVC中切换Select后Checkbox状态显示与属性不符问题

问题描述
  • 点击复选框触发change事件时,可正常调用接口修改数据库
  • 切换下拉选择框时,虽调用了loadPackageFeatures函数,但之前手动修改的最后一个复选框仍显示勾选状态,查看元素属性却无checked属性
问题原因

问题出在使用jQuery的attr()和removeAttr()操作复选框选中状态。这两个方法仅操作DOM元素的HTML属性,而复选框的选中状态属于浏览器维护的DOM元素内部状态(property)。用户手动点击复选框后,浏览器会更新内部状态,此时用attr()/removeAttr()无法同步这个状态,导致视觉显示与实际属性不一致。

修复代码

将loadPackageFeatures函数中操作复选框的代码替换为prop()方法(专门用于操作DOM元素的状态属性):

$(document).ready(function () {
    loadPackageFeatures();
})
$(document).on("change", "input", function () {
    editPackageFeatures()
})
$(document).on("change", "select", function () {
    loadPackageFeatures();
})

function loadPackageFeatures() {
     var PackageId = "@Model.PackageId";
    let typeid = $("#typeId").find(":selected").val()
    $.ajax(
        {
            type: "POST",
            url: '@Url.Action("GetCheckedFeatures","Home")',
            data: {
                Id: PackageId,
                PkgType: typeid,
            },
            traditional: true,
            success: function (data, status, xhr) {
                var CheckedPackageFeaturesIds = data.PackageFeaturesIds
                $('input[type=checkbox]').each(function () {
                    var currentValue = this.value * 1
                    if (CheckedPackageFeaturesIds.indexOf(currentValue) !== -1) {
                        $(this).prop('checked', true);
                    }
                    else {
                        $(this).prop('checked', false);
                    }
                })
            },
        }
    );
}

function editPackageFeatures() {
     var PackageId = "@Model.PackageId";
    let typeid = $("#typeId").find(":selected").val()
    let selectedFeatures = []
    $('input[type=checkbox]:checked').each(function () {
        selectedFeatures.push($(this).val());
    })

    $.ajax(
        {
            type: "POST",
            url: '@Url.Action("EditPackageFeatures", "Home")',
            data: {
                PackageId: PackageId,
                PlanType: typeid,
                PackageFeaturesIds: selectedFeatures
            },
            traditional: true,
            success: function (data, status, xhr) {
                
            },
        }
    );
}
关键说明
  • prop()方法用于操作DOM元素的动态状态属性(如checked、disabled),能同步浏览器内部维护的状态
  • attr()仅用于操作HTML标签上初始定义的静态属性,不适合处理用户交互后的动态状态变更

内容的提问来源于stack exchange,提问作者Shahreyar Butt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 14:35:56