.net 在Multiselect列表框(MVC3)中预选项目

.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

我在列表框中预选项目时遇到问题。 我正在使用带有MVC3的razor视图引擎。我知道有一些帖子有同样的问题,但它们不适合我

课堂代码:

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" })