我有许多包含用户名的下拉列表。每个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); }
}
答案 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数组中所有用户的列表。每次选择用户时,重新填充其他列表并排除所选用户。确保在重新填充之前检查是否已在其他列表中进行了选择,这样您就不会删除选择。