Wilsonhut

Deal with it or don't

Monthly Archives: February 2011

A Betterer ToSelectListItems

Last year, I did a post about Select List building in asp.net MVC. It’s now even better:

public static class DropDownExtensions
{
  public static DropDownViewModel<TValue> ToDropDownViewModel<T, TValue>(this IEnumerable<T> items,
                                                                          Func<T, string> textSelector,
                                                                          Func<T, TValue> valueSelector)
  {
    return ToDropDownViewModel(items, textSelector, valueSelector, item => null);
  }
  public static DropDownViewModel<TValue> ToDropDownViewModel<T, TValue>(this IEnumerable<T> items,
                                                                          Func<T, string> textSelector,
                                                                          Func<T, TValue> valueSelector,
                                                                          Func<T, IComparable> sortSelector)
  {
    return new DropDownViewModel<TValue>(items
                                          .Select(item =>
                                                   new DropDownItem<TValue>
                                                     {
                                                       Text = textSelector(item),
                                                       Value = valueSelector(item),
                                                       Sort = sortSelector(item)
                                                     }));
  }
}


Again, this could be a Tuple:

public class DropDownItem<TValue>
{
  public string Text { get; set; }
  public TValue Value { get; set; }
  public IComparable Sort { get; set; }
}


And the DropDownViewModel:

public class DropDownViewModel<TValue>
{
  private readonly IEnumerable<DropDownItem<TValue>> _dropDownItems;
  internal DropDownViewModel(IEnumerable<DropDownItem<TValue>> dropDownItems)
  {
    _dropDownItems = dropDownItems;
  }
  public IEnumerable<SelectListItem> GetSelectListItems(TValue selectedValue, bool addEmpty = false)
  {
    return GetSelectListItems(item => Equals(item.Value, selectedValue), addEmpty);
  }
  public IEnumerable<SelectListItem> GetSelectListItems(Func<DropDownItem<TValue>, bool> getIsSelected, bool addEmpty = false)
  {
    if (addEmpty)
    {
      yield return new SelectListItem();
    }
    foreach (var item in _dropDownItems.OrderBy(ddi => ddi.Sort))
    {
      yield return new SelectListItem
      {
        Text = item.Text,
        Value = item.Value.ToString(),
        Selected = getIsSelected(item),
      };
    }
  }
}
Advertisements