我在 MVC 中有双列表框。需要在服务器上发布所选列表框中所有项目的ID。模型有三个属性定义
IEnumerable<SelectListItem> AvailItems {get;set;}
IEnumerable<SelectListItem> SelectedItems {get;set;}
string SelectedItemIds {get;set;}
我已将availItems
和selectedItems
列表框填充为不同的名称,SelectedItemIds
属性为hiddenfield。如果用户在列表框中添加/删除项目,Javascript将更新隐藏字段。在httpost中,我只收到selectedItemIds
,因为列表框的名称已更改,这是预期的行为。
问题是当模型无效或发生任何异常时,返回View(model)
执行,列表框填充空值,但hiddenfield
包含已修改项的值。当用户再次提交页面时,hiddenfield
的值将被发布,但显示的项目将来自db。我遵循这种方法使用hiddenfield
而不是在提交之前选择所有项目(使用javascript),因为如果非js用户提交页面,它不会有害。来自hiddenfield
的值会被接收。
有关如何处理上述情况的任何想法?
答案 0 :(得分:1)
在执行View(model)
之前,为什么不将这些信息重新填充到模型中?我假设您的代码类似于:
if (ModelState.IsValid)
{
//...all is ok
}
else
{
model.AvailItems = // repopulate
model.SelectedItems = // repopulate
return View(model);
}