根据在其他下拉列表中选择的项目删除下拉列表中的项目

时间:2016-04-08 15:37:11

标签: c# razor drop-down-menu asp.net-mvc-5

我有许多包含用户名的下拉列表。每个ddl都是从同一个模型生成的(它们保存相同的信息)。

但是,每个用户只能在此表单中选择一次。有没有办法检查哪些用户已被选中并阻止它们出现在下拉列表中,然后如果从dll中删除该值则再次重新显示。

查看

@using (Html.BeginForm("Submit", "Booking", FormMethod.Post))
{
    <div id="modalbox" class="modal">
        <div class="modal-dialog">
            <div class="modal-content">
                <div id="modal-header" class="modal-header">
                    <h1>Register New Booking</h1>
                </div>
                <div class="modal-body">
                    <table id="booking-model-table" class="table table-condensed table-striped table-bordered">
                        <tr>
                            <td>Person1:</td>
                            <td>
                                @{
                                    @Html.DropDownListFor(m => m.User, Model.UserList, "Select User", new { @class = "form-control", @id = "idP1" })
                                    @Html.HiddenFor(m => m.SelectedUserText)
                                    @Html.ValidationMessageFor(m => m.User, "", new { @class = "text-danger" })
                                }
                            </td>
                        </tr>
                        <tr>
                            <td>Person2:</td>
                            <td>
                                @{
                                    @Html.DropDownListFor(m => m.User, Model.UserList, "Select User", new { @class = "form-control", @id = "idP2" })
                                    @Html.HiddenFor(m => m.SelectedUserText)
                                    @Html.ValidationMessageFor(m => m.User, "", new { @class = "text-danger" })
                                }
                            </td>
                        </tr>
                        <tr>
                            <td>Person3:</td>
                            <td>
                                @{
                                    @Html.DropDownListFor(m => m.User, Model.UserList, "Select User", new { @class = "form-control", @id = "idP3" })
                                    @Html.HiddenFor(m => m.SelectedUserText)
                                    @Html.ValidationMessageFor(m => m.User, "", new { @class = "text-danger" })
                                }
                            </td>
                        </tr>
                        <tr>
                            <td>Person4:</td>
                            <td>
                                @{
                                    @Html.DropDownListFor(m => m.User, Model.UserList, "Select User", new { @class = "form-control", @id = "idP4" })
                                    @Html.HiddenFor(m => m.SelectedUserText)
                                    @Html.ValidationMessageFor(m => m.User, "", new { @class = "text-danger" })
                                }
                            </td>
                        </tr>
                    </table>
                </div>
                <div class="modal-footer">

                    @Html.AntiForgeryToken()
                    <button class="btn btn-default" data-dismiss="modal">Close</button>
                    <button class="btn btn-primary" type="submit" value="Submit">Ok</button>

                </div>
            </div>
        </div>
    </div>
                                    }

模型

/// <summary>
/// User List
/// </summary>
[Display(Name = "Users")]
public string User { get; set; }
public IEnumerable<SelectListItem> UserList { get; set; }
public string SelectedUserText { get; set; }

这可能吗?我正在考虑添加一些javascript来删除onchange事件中的项目,但是当每个ddl运行相同的模型时,我想象它会删除响应。

更新 我找到了一个可行的解决方案,目前适用于我,使用Javascript并为每个下拉列表添加座位选择值。

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

Javascript文件:

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

//If a user is selected disable them
if (val != 0) { $(".seat-select option[value='" + val + "']").attr("disabled", true); }

//If the previous value has been defined, enable the user again 
if (vOldVal != undefined) { $(".seat-select option[value='" + vOldVal + "']").attr("disabled", false); }

}

2 个答案:

答案 0 :(得分:0)

我认为您可以创建本地列表对象List<MyType> selectedUsers = new List<MyType>();,并且从列表中选择用户,您可以将它们添加到selectedUsers。将selectedUsers与可用用户进行比较,如果匹配,请从其他列表中删除该用户。绝对有很多方法可以做到这一点,但这是首先想到的。

答案 1 :(得分:0)

您是否有针对同一型号的多个下拉列表的具体原因?我假设您只是尝试选择从同一模型加载的多个用户。在这种情况下,您只需使用具有multiple属性的选择列表。


@Html.DropDownListFor(m => m.User, Model.UserList, "Select User", new { multiple = "", @class = "form-control", @id = "idP2" })

但是,如果您确实需要使用多个下拉列表 - 并且我假设您希望在提交表单之前实现所有这些 - 那么您将不得不使用JavaScript。维护JavaScript数组中所有用户的列表。每次选择用户时,重新填充其他列表并排除所选用户。确保在重新填充之前检查是否已在其他列表中进行了选择,这样您就不会删除选择。