在视图中,我有
<div class="form-group">
<div>
@Html.LabelFor(m => m.DoctorList, new { @class = "control-label" })
</div>
<div>
@Html.ListBoxFor(m => m.DoctorList, new MultiSelectList((List<SelectListItem>)ViewBag.DoctorList, "Value", "Text", ((List<string>)(ViewBag.DoctorsSelected)).ToArray()), new {style="display:block;height:20.0em;", @class = "form-control", Multiple = "multiple"})
</div>
</div>
DoctorList是模型中的列表,ViewBag.DoctorList是整个医生列表,它们类似于:
public static List<SelectListItem> GetDoctorList()
{
List<SelectListItem> ret = new List<SelectListItem>();
// load doctors from database
// for now, fake data
for (int k = 1; k <= 30; k++)
{
string n = "Doctor" + k.ToString();
ret.Add(new SelectListItem() { Value = n, Text = n });
}
return ret;
}
ViewBag.DoctorsSelected是一个List,它是一个医生名字列表,类似于:
List<string> doctorsSelected = new List<string>();
doctorsSelected.Add("Doctor1");
doctorsSelected.Add("Doctor5");
我想要做的是预先选择列表框中的医生。但是,它始终显示列表框,但没有重选。
我还尝试在GetDoctorList()
中使用以下内容ret.Add(new SelectListItem() { Value = n, Text = n, Select = true });
仍然没有预选。
任何人都知道怎么做?我正在使用MVC4。
由于
答案 0 :(得分:2)
您不能对绑定的属性和SelectList
使用相同的名称。你的模型应该有一个属性(比如说)
public IEnumerable<string> SelectedDoctors { get; set; }
,视图将是
@Html.ListBoxFor(m => m.SelectedDoctors, (IEnumerable<SelectListItem>)ViewBag.DoctorList)
如果SelectedDoctors
包含与SelectList
中的值匹配的值,则在呈现视图时将选择这些项目。例如,在控制器中,
model.SelectedDoctors = new List<string> { "Doctor1", "Doctor5" };
return View(model);
另请注意,ViewBag.DoctorList
已经IEnumerable<SelectListItem>
,因此在您的视图中使用IEnumerable<SelectListItem>
从中创建相同的新new SelectList()
只是毫无意义的额外开销。
编辑(响应OP查询,为什么名称必须不同)
ListBoxFor()
的工作方式是
ViewDataDictionary
(在您的情况下是项目中的项目)
ViewDataDictionary
是List<SelectListItem>
)。IEnumerable<SelectListItem>
建立新 SelectList
在第二个参数中提供(为了设置Selected
每个SelectListItem
的属性基于您的绑定值
到)。<option>
为每个Value
元素生成html,
每个Text
的{{1}}和Selected
属性。在您的情况下,在创建每个SelectListItem
时,它会检查您的绑定属性中的任何值是否与SelectListItem
的{{1}}属性匹配,但您的值为{{ 1}}(它们是复杂的对象,因此使用了对象的Value
值)并且SelectList
没有任何值"System.Web.Mvc.SelectListItem"
(仅.ToString()
&#34 ;,SelectListItems
等)因此"System.Web.Mvc.SelectListItem"
属性为"Doctor1
,因此"Doctor2"
个元素都没有设置Selected
属性。
以上是一个简化的说明,如果您希望了解它的工作原理,可以view/download the source code here。