Dot-Net

多選列錶框中的預選項目(MVC3 Razor)

  • May 2, 2011

我在列錶框中預選項目時遇到問題。我正在使用帶有 mvc 3 的 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;}
   }

}

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

我嘗試了很多其他的東西,但沒有任何效果。希望有人可以提供幫助。

我無法真正解釋為什麼,但我設法讓它工作。這些中的任何一個都有效:

@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;
}

我猜這與能夠跨請求持續存在有關(這將被展平為要通過網路傳遞的字元串),但這有點令人困惑!

引用自:https://stackoverflow.com/questions/5858679