2013-06-04 22 views
6

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); 

Trả lời

8

Bạn có thể cung cấp callbacks mà lấy chìa khóa và giá trị và sau đó sử dụng chúng. Ngoài ra bạn có thể tạo nó như một phương pháp khuyến nông:

phương pháp mở rộng:

public static List<SelectListItem> ToSelectList<T>(this List<T> Items, Func<T, string> getKey, Func<T, string> getValue, 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 Items) 
     { 
      items.Add(new SelectListItem 
      { 
       Text = getKey(item), 
       Value = getValue(item), 
       Selected = selectedValue == getValue(item) ? true : false 
      }); 
     } 

     return items 
      .OrderBy(l => l.Text) 
      .ToList(); 
    } 

Cách sử dụng:

List<Org>() parentOrganisations = // fetch here 
model.Organisations = parentOrganisations.ToSelectList(org => org.ID.ToString(), 
                 org => org.OrganisationName, 
                 "-1", 
                 "-- None -- ", 
                 true); 

Lưu ý: Tôi gõ này trong SO-biên tập viên, vì vậy bạn có thể có một số lỗi cú pháp (chúng sẽ dễ dàng để giải quyết).

+0

Cảm ơn bạn! Đây chính xác là những gì tôi đã hy vọng. – Paul

1

Bạn có thể làm trong điều khiển chỉ như thế này: -

List<SelectListItem> dropdownItems = parentOrganisations 
    .Select(item => new SelectListItem 
    { 
     Value = item.ID.ToString(), 
     Text = item.OrganisationName, 
     Selected = "-1" == item.ID.ToString() ? true : false 
    }) 
    .ToList();