我正在构建一个非常简单的表单来编辑对象的属性。其中一个属性是与之关联的其他对象的列表,因此我使用的是两个列表系统:左侧是当前关联对象的列表,右侧是可用对象的列表添加; 下面的添加和删除按钮将相关操作应用于相关列表中突出显示的项目。很简单。
一切正常,除了一件事:当页面加载时,两个列表中的所有项目都被选中,即使我Selected = false
在创建用于填充列表的项目时特别设置。这意味着如果用户提交表单时没有触及列表,“当前”列表中的所有内容都会被删除,而“可用”列表中的所有内容都会被添加。由于它们是多选列表框,因此没有可供用户选择的虚拟选项,因此这个问题迫使他们始终删除至少一个当前项目并添加至少一个可用项目。即使有一个虚拟项目,它也会迫使用户去选择它,如果他们忘记了,他们的列表就会变得一团糟。
[编辑添加:]
控制器方法正在执行的操作的示例:
[HttpGet]
public ActionResult EditForm(int objectId)
{
MyObject objectToEdit = _objectStore.GetObject(objectId);
ObjectEditViewModel viewModel = new ObjectEditViewModel();
viewModel.Object = objectToEdit;
viewModel.AssociatedItemSelectList = objectToEdit.AssociatedItems.Select(o => new SelectListItem { Text = o.Name, Value = o.Id, Selected = false });
viewModel.AvailableItemSelectList = _itemStore.GetAllItems().Where(o => !objectToEdit.AssociatedItems.Contains(o))
.Select(o => new SelectListItem { Text = o.Name, Value = o.Id, Selected = false });
return View(viewModel);
}
...而视图只是
@Html.ListBoxFor(m => m.ItemsToAdd, Model.AvailableItemSelectList)
和
@Html.ListBoxFor(m => m.ItemsToRemove, Model.AssociatedItemSelectList)
在相关的地方。当页面加载时,选择列表框中的每个选项都具有以下形式:
<option selected="selected" value="281">Example Item</option>
在创建列表和呈现页面之间如何选择项目?我该如何阻止它?或者,如果做不到这一点,我如何在页面加载时立即取消选择它们,以便用户看起来好像它们开始未选择?我有一个修复程序可以使页面看起来像它应该的那样,但我想找到这个问题的根源。