2011-02-01 43 views
2

我想弄清楚這DropDownListFor如何工作,但沒有成功。
我控制器創建,我把所有的數據庫中找到的組SelectListItems列表:ASP.NET MVC2:DropDownListFor無法正常工作與多個選擇+ modelbinder

viewModel.Groups = LoadGroups(viewModel.User.AssociatedGroups); 

這一點,方法:

private IList<SelectListItem> LoadGroups(List<String> associatedGroups) 
{ 
    var groups = _SecurityService 
      .LoadGroups() 
      .Select(e => new SelectListItem 
      { 
       Selected = associatedGroups.Contains<System.String>(e.Id.ToString()), 
       Value = e.Id.ToString(), 
       Text = e.Name 
      }).ToList(); 
    return (groups); 
} 

正如你可以看到我設置選定的元素,如果有是列表中的關聯組。 我把這個列表中的字段(組)我的自定義視圖模型的:

public class UsersViewModel 
    { 
     public UsersViewModel() 
     { 
      this.Groups = new List<SelectListItem>(); 
     } 
     public Models.User User { get; set; } 
     public IList<SelectListItem> Groups { get; set; } 
    } 

和發送UsersViewModel到視圖。我用這個代碼來構建一個下拉多選:

<%=Html.DropDownListFor(m => m.User.AssociatedGroups, (List<System.Web.Mvc.SelectListItem>)Model.Groups, new { @class = "dropDownGroups", multiple = "multiple" })%> 

AssociatedGroups是一場類用戶(這是我的視圖模型中的一員):

public List<String> AssociatedGroups { get; set; } 

沒有什麼特殊的位置。 如果我使用此代碼,我可以看不到所選下拉列表中的元素(並且它們具有設置的屬性,我已經進行了雙重檢查),但是當我發佈表單時,我可以將選擇與AssociatedGroups綁定。 如果我改變了字符串AssociatedGroups(User類的字段):

public String AssociatedGroups { get; set; } 

我有相反的行爲:

我可以看到下拉菜單的內容檢查,但是當我發帖的形式有沒有綁定,或更好,只綁定一個元素。 我花了我大部分時間試圖找出問題和我試過不同的組合,但他們都沒有工作。 有沒有人可以試圖幫助我?

謝謝。

回答

3

您需要在您的視圖模型的兩個屬性:一個將包含選定的組ID和一個將包含列表:

public class UsersViewModel 
{ 
    public IEnumerable<SelectListItem> Groups { get; set; } 
    public IEnumerable<string> SelectedGroupIds { get; set; } 
} 

,然後你可以使用ListBoxFor助手,允許多種選擇:

<%= Html.ListBoxFor(
    m => m.SelectedGroupIds, 
    new SelectList(Model.Groups, "Value", "Text"), 
    new { @class = "dropDownGroups" } 
) %> 

現在假設下面的視圖模型被傳遞給視圖:

public ActionResult Index() 
{ 
    var model = new UsersViewModel 
    { 
     // TODO: Use a repository to fetch those values 
     // and map them to the view model 
     Groups = new[] 
     { 
      new SelectListItem { Value = "1", Text = "group 1" }, 
      new SelectListItem { Value = "2", Text = "group 2" }, 
      new SelectListItem { Value = "3", Text = "group 3" }, 
     }, 
     // We want to preselect the last two groups in the listbox 
     SelectedGroupIds = new[] { "2", "3" } 
    }; 
    return View(model); 
} 

[HttpPost] 
public ActionResult Index(IEnumerable<string> selectedGroupIds) 
{ 
    // Here we will get the list of selected ids 
    // when the form containing the listbox is 
    // submitted 
    ... 
} 

然後在視圖上最後兩個元素將被自動預選。

+0

感謝Darin,雖然我只是改變了SelectList中的DropDownListFor,但它很有幫助。我把所有的東西都保存下來,因爲我粘貼了它,而且效果很好。謝謝。 – LeftyX 2011-02-01 18:24:26