Предварительно выбрать элементы в Multiselect-Listbox (MVC3 Razor)
У меня проблема с выбором элементов в списке.
Я использую механизм просмотра бритвы с mvc 3. Я знаю, что есть несколько сообщений с той же проблемой, но они не работают для меня.
Код в классе:
public class Foo{
private int _id;
private string _name;
public string Name{
get{
return _name;
}
public int Id {
get{
return _id;
}
}
Код в модели:
public class FooModel{
private readonly IList<Foo> _selectedFoos;
private readonly IList<Foo> _allFoos;
public IList<Foo> SelectedFoos{
get{ return _selectedFoos;}
}
public IList<Foo> AllFoos{
get{ return _allFoos;}
}
}
Код в cshtml:
@Html.ListBoxFor(model => model.Flatschels,
Model.AllFlatschels.Select(fl => new SelectListItem {
Text = fl.Name,
Value = fl.Id.ToString(),
Selected = Model.Flatschels.Any(y => y.Id == fl.Id)
}), new {Multiple = "multiple"})
Я пробовал много других вещей, но ничего не получилось. Надеюсь, кто-то может помочь.
Ответы
Ответ 1
Я не могу объяснить, почему, но мне удалось заставить его работать. Любой из них работал:
@Html.ListBoxFor(m => m.SelectedFoos,
new MultiSelectList(Model.AllFoos, "ID", "Name"), new {Multiple = "multiple"})
@Html.ListBoxFor(m => m.SelectedFoos, Model.AllFoos
.Select(f => new SelectListItem { Text = f.Name, Value = f.ID }),
new {Multiple = "multiple"})
Проблема заключается в том, что свойство Selected на SelectListItem игнорируется, и вместо этого вызывается метод ToString()
(!), поэтому, если вам нужно добавить это в свой класс Foo
:
public override string ToString()
{
return this.ID;
}
Я предполагаю, что это имеет какое-то отношение к тому, чтобы быть в состоянии сохранять запросы (которые будут сплющены к строкам, которые будут переданы по проводу), но это немного запутывает!
Ответ 2
В MVC5 вы можете напрямую использовать ListBoxFor с multiselect. Убедитесь, что при загрузке представления ваш выбранный элемент должен иметь список элементов.
@Html.ListBoxFor(m => m.SelectedItem, new MultiSelectList(Model.Item.ToList(), "Value", "Text"), new { @class = "form-control" })