在ASP.Net MVC4中设置ListBox的预选?

时间:2016-04-02 21:56:15

标签: c# asp.net-mvc asp.net-mvc-4 listbox

在视图中,我有

<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。

由于

1 个答案:

答案 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()的工作方式是

  1. 从中获取绑定属性的值 ViewDataDictionary(在您的情况下是项目中的项目) ViewDataDictionaryList<SelectListItem>)。
  2. IEnumerable<SelectListItem>建立 SelectList 在第二个参数中提供(为了设置Selected 每个SelectListItem的属性基于您的绑定值 到)。
  3. 根据<option>为每个Value元素生成html, 每个Text的{​​{1}}和Selected属性。
  4. 在您的情况下,在创建每个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