将下拉列表设为只读

make dropdown readonly

本文关键字:只读 下拉列表      更新时间:2023-09-26

虽然这个问题是从MVC4开始的,但我发现的答案更通用,适用于JQuery,并且可以在通用中使用

如何使下拉列表只读(限制更改值),但提交时控制器上的数据可用?

当我在编辑模式下显示for时,我想根据某些条件禁用特定的下拉列表。然而,在提交时,我需要控制器中可用的数据,这样我就可以直接使用对象来使用EF进行更新。

如果我使用禁用的属性,则数据将不可用于控制器,并且我需要编写许多其他代码来获取该属性或在更新时跳过该属性。

有没有一个可以在所有屏幕上轻松应用的快速解决方法?

不,我不想在提交时禁用它并启用它!!!

我不确定这是否是最好的解决方案,听起来像是变通方法,但您可以在表单中添加隐藏输入,其值等于下拉菜单中的选定项(已禁用)。下拉菜单将被禁用,当提交表单时,您可以在控制器中获得隐藏输入的值。

仅用代码显示@ntl还回答了MVC中禁用下拉列表的解决方法:

型号:

Public int FooId {get;set;}

控制器:

@Html.DropDownListFor(x => x.FooId, Model.Foos, new { disabled = "disabled" })
@Html.HiddenFor(x => x.FooId)

如果您必须使用javascript动态禁用下拉列表,那么只需在禁用后将下拉列表的当前选定值分配给隐藏字段即可。

现在隐藏字段'FooId'将为您提供控制器后操作的下拉值。

我建议不要依赖未更改的数据。数据在发送到浏览器并返回到服务器后就不再可靠了。一路上很容易改变。

尤其是当你"直接"更新数据库时。

尝试不太通用(不仅仅是MVC.NET)

$.fn.extend({
    readonlyddl: function () {
        if (this.is('[readonly]')) {
            //  save current value
            var val = this.val();
            //  remove any events that fire on change
            this.unbind("change");
            //reset the value when the select change
            this.change(function () {
                $(this).val(val);
            });
        }
    }
});
//  $("#ID").readonlyddl();