Tôi hiện không hài lòng với cách mà đối tượng DropDownListFor() của tôi được điền. Tôi đang cố gắng để tìm cách chung chung của populating IEnumerable càng tốt. Đây là những gì tôi có cho đến nay.ASP.NET MVC 3 Danh sách <T> tới IEnumerable <SelectListItem>
Helper:
public static List<SelectListItem> ToSelectList(IDictionary<string,string> dictionaryItems, string selectedValue, string noSelection, bool search = false)
{
List<SelectListItem> items = new List<SelectListItem>();
if (search)
{
items.Add(new SelectListItem { Selected = true, Value = "-1", Text = string.Format("-- {0} --", noSelection) });
}
foreach (var item in dictionaryItems)
{
items.Add(new SelectListItem
{
Text = item.Key,
Value = item.Value,
Selected = selectedValue == item.Value ? true : false
});
}
return items
.OrderBy(l => l.Text)
.ToList();
}
Bộ điều khiển:
[HttpGet]
public ActionResult Index()
{
var model = new CreateModel();
var parentOrganisations = _orgs.FindBy(o => o.OwningOrganisationID == Globals.OrganisationID || o.ID == Globals.OrganisationID)
.OrderBy(o => o.OrganisationName);
Dictionary<string, string> items = new Dictionary<string, string>();
foreach (var item in parentOrganisations)
{
items.Add(item.OrganisationName, item.ID.ToString());
}
model.Organisations = SelectLists.ToSelectList(items, "-1", "-- None -- ", true);
return View(model);
}
Xem:
<div class="control-group">
<label class="control-label">Parent Organisation</label>
<div class="controls">
@Html.DropDownListFor(m => m.ParentOrganisationID, Model.Organisations, new { @class = "input-xlarge"})
<p class="help-block">Select a parent organisation to create a branch</p>
</div>
</div>
Dường như có rất nhiều mã lặp đi lặp lại trong bộ điều khiển. Nó lấy một danh sách chung, thêm Giá trị và Văn bản vào một Từ điển và sau đó sử dụng nó làm đầu vào cho một trình trợ giúp tạo danh sách chọn để gửi như là một phần của mô hình.
Có ai có cách nào tốt hơn để đạt được điều này không? Tôi ghét có sưng lên trong bộ điều khiển của tôi, và khi tôi nhận được một số thả xuống trên một hình thức này là chính xác những gì sẽ xảy ra trong trường hợp này.
Cảm ơn,
EDIT - Nhờ phương pháp helper Kenneth, bây giờ tôi đã củng cố toàn bộ điều vào một cuộc gọi trong bộ điều khiển:
model.Organisations = _orgs.FindBy(o => o.OwningOrganisationID == Globals.OrganisationID || o.ID == Globals.OrganisationID)
.OrderBy(o => o.OrganisationName)
.ToList()
.ToSelectList(org => org.OrganisationName, org => org.ID.ToString(), "-1", "None", true);
Cảm ơn bạn! Đây chính xác là những gì tôi đã hy vọng. – Paul