禁用下拉列表项而不从FormCollection中删除值

时间:2016-05-19 20:37:47

标签: javascript c# razor asp.net-mvc-5

我在此页面中有许多以下下拉列表,每个列表都包含可选用户列表。当在一个列表中选择用户时,我不希望在任何其他列表中选择它们。出于这个原因,我编写了一个禁用它们的脚本。

提交表单时,下拉列表中选择的每个用户的用户名应附加到表单集合中的User值。

这可以在不禁用名称的情况下正常工作,但是当我在类描述中添加seat-select时,名称总是在FormCollection中作为空字符串返回。

您是否知道为什么这样做或者我可以做些什么来保持名称在FormCollection中正确填充?

下拉列表:

@Html.DropDownListFor(m => m.User, Model.UserList, "Select User", new { @class = "form-control seat-select", @id = "uniqueID", @onchange = "cleanUsers(this);" })

Java脚本:

function cleanUsers(ddl) {
    var val = ddl.options[ddl.selectedIndex].value;
    var vOldVal =   $("#" + ddl.id).attr("data-selected");
                    $("#" + ddl.id).attr("data-selected", val);

    //Remove selected
    if (val != 0) { $(".seat-select option[value='" + val + "']").attr("disabled", true); }
    if (vOldVal != undefined) { $(".seat-select option[value='" + vOldVal + "']").attr("disabled", false); }
}

2016年6月6日更新: 道歉要带回旧帖子。我已经尝试了下面列出的建议,这可以返回一个选定的值。不幸的是,在我的解决方案中,我有许多相同的下拉列表,我需要跟踪哪个下拉列表的确切结果。

我在下面发布了我的新代码。当每个下拉菜单都被更改时,该字符串将被覆盖,因此当前不适合我。

新JavaScript:

function cleanRowers(ddl) {
     var val = ddl.options[ddl.selectedIndex].value;
     var vOldVal = $("#" + ddl.id).attr("data-selected");
     $("#" + ddl.id).attr("data-selected", val);

     //Remove selected
     if (val != 0) {
         $("#SelectedUserText").val(val);
         $(".seat-select option[value='" + val + "']").attr("disabled", true);
     }
     if (vOldVal != undefined) { $(".seat-select option[value='" + vOldVal + "']").attr("disabled", false); }
}

隐藏值正在更新:

@Html.HiddenFor(m => m.SelectedUserText)

我正在尝试使代码尽可能可重用,因此不要为每个下拉列表设置不同的标识符,但重要的是我要跟踪信息来自哪个下拉列表。< / p>

有没有办法可以做到这一点?

1 个答案:

答案 0 :(得分:0)

已禁用的属性不会在表单提交中输入值,这就是您收到空字符串的原因。 这是一个你可以应用的技巧: 将所选值放在隐藏的输入字段onchnage函数中,然后读取表单提交上的隐藏值,而不是读取禁用下拉列表的vslue。 希望有所帮助。