在Multiselect-Listbox中预选项目(MVC3 Razor)

时间:2011-05-02 14:54:35

标签: .net asp.net-mvc asp.net-mvc-3 razor

我在列表框中预选项目时遇到问题。 我正在使用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"}) 

我尝试了很多其他的东西,但没有任何效果。希望有人可以提供帮助。

2 个答案:

答案 0 :(得分:31)

我无法解释原因,但我设法让它发挥作用。其中任何一个都有效:

@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类:< / p>

public override string ToString()
{
    return this.ID;
}

我猜测它与能够持续跨越请求(它将被平铺为通过线路传递的字符串)有关,但它有点令人困惑!

答案 1 :(得分:0)

在MVC5中,您可以直接使用带有多选的ListBoxFor。确保在加载视图时,您的selectedItem应该包含项目列表。

@Html.ListBoxFor(m => m.SelectedItem, new MultiSelectList(Model.Item.ToList(), "Value", "Text"), new { @class = "form-control" })