2016-03-31 53 views
3

我试图使用SelectListGroup返回SelectList<optgroup>,但下面的代码只返回SelectList中没有组的值。我如何让我的选择列表按组分隔?SelectList与SelectListGroup

public SelectList MyList() 
{ 
    var group1 = new SelectListGroup() { Name = "Group 1" }; 
    var group2 = new SelectListGroup() { Name = "Group 2" }; 

    var items = new List<SelectListItem>(); 

    items.Add(new SelectListItem() { Value = "1", Text = "Item 1", Group = group1 }); 
    items.Add(new SelectListItem() { Value = "2", Text = "Item 2", Group = group2 }); 

    return new SelectList(items, "Value", "Text"); 
} 
+0

你可以用组创建'List ',但是通过创建并返回一个新的'SelectList'将其扔掉。将该方法更改为'public List MyList()'和'return items;' –

+0

感谢您的帮助。它仍然不会在列表中显示我的组。 – user2531854

+0

这应该可以正常工作。实际发生了什么,以及您如何在视图中使用它? –

回答

5

我觉得这个方法可行,它使用一个强类型的方法:

视图模型:

public class PageViewModel 
{ 
    public int SelectedDropdownItem { get; set; } 
    public IEnumerable<SelectListItem> DropdownList { get; set; } 
} 

例实体模型(在这个例子中):

public class Entity 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public bool IsActive { get; set; } 
    public bool IsDefault { get; set; } 
} 

控制器:

// Get list for the dropdown (this uses db values) 
var entityList = db.Entity.ToList(); 

// Define the Groups 
var group1 = new SelectListGroup { Name = "Active" }; 
var group2 = new SelectListGroup { Name = "Allowed" }; 

// Note - the -1 is needed at the end of this - pre-selected value is determined further down 
// Note .OrderBy() determines the order in which the groups are displayed in the dropdown 
var dropdownList = new SelectList(entityList.Select(item => new SelectListItem 
{ 
    Text = item.Name, 
    Value = item.Id, 
    // Assign the Group to the item by some appropriate selection method 
    Group = item.IsActive ? group1 : group2 
}).OrderBy(a => a.Group.Name).ToList(), "Value", "Text", "Group.Name", -1); 

// Assign values to ViewModel 
var viewModel = new PageViewModel 
{ 
    // Assign the pre-selected dropdown value by appropriate selction method (if needed) 
    SelectedDropdownItem = entityList.FirstOrDefault(a => a.IsDefault).Id, 
    DropdownList = dropdownList 
}; 

查看:

<!-- If needed, change 'null' to "Please select item" --> 
@Html.DropDownListFor(a => a.SelectedDropdownItem, Model.DropdownList, null, new { @class = "some-class" }) 

希望它可以帮助别人。