.net 在Multiselect列表框(MVC3)中预选项目
我在列表框中预选项目时遇到问题。 我正在使用带有MVC3的razor视图引擎。我知道有一些帖子有同样的问题,但它们不适合我 课堂代码:.net 在Multiselect列表框(MVC3)中预选项目,.net,asp.net-mvc,asp.net-mvc-3,razor,.net,Asp.net Mvc,Asp.net Mvc 3,Razor,我在列表框中预选项目时遇到问题。 我正在使用带有MVC3的razor视图引擎。我知道有一些帖子有同样的问题,但它们不适合我 课堂代码: public class Foo{ private int _id; private string _name; public string Name{ get{ return _name; } public int Id { get{ re
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;}
}
}
我尝试了很多其他的方法,但都没有效果。希望有人能帮上忙。我真的无法解释原因,但我设法让它工作起来了。这两种方法中的任何一种都有效:
@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"})
问题似乎是SelectListItem上的Selected属性被忽略,而调用的是ToString()
(!)方法,因此如果需要将其添加到Foo
类中:
public override string ToString()
{
return this.ID;
}
我猜这与能够跨请求持久化有关(请求将被扁平化为字符串,以便通过线路传递),但这有点令人困惑 在MVC5中,您可以直接将ListBoxFor与multiselect一起使用。确保在加载视图时,selectedItem应具有项目列表
@Html.ListBoxFor(m => m.SelectedItem, new MultiSelectList(Model.Item.ToList(), "Value", "Text"), new { @class = "form-control" })
谢谢。我让它工作了。虽然只有第二个代码起作用,而且在我看来,这并不是因为重写了ToString()。我的Id属性是一个int,我添加了一个返回唯一字符串(guid.ToString())的属性键。奇怪。无法解释ToString的事情,但很高兴你把它整理好了:-)这完全是因为ToString()。刚刚在微软论坛上发布了一个问题,希望得到一个答案,也许还有一个信息,为什么(以及多长时间)他们现在是这样的。同样的行为在Razor for MVC4上。bug上的边界(至少对于ListBox(),它不希望模型对其上的元素进行比较)。对我来说也是如此!无论出于何种原因,以下操作都不起作用:
@Html.DropDownListFor(m=>m.SelectedFoos,new MultiSelectList(Model.AllFoos),new{multiple=”“}
(在我的例子中,Foo
是一个枚举,而不是元组对象。我需要做的唯一更改是DropDownListFor
->ListBoxFor
@Html.ListBoxFor(m => m.SelectedItem, new MultiSelectList(Model.Item.ToList(), "Value", "Text"), new { @class = "form-control" })