Работа со списками выбора - PullRequest
4 голосов
/ 10 мая 2011

Я получил модель, определенную как IEnumerable<MyViewModel>, которую я пытался использовать для создания списка выбора (Html.SelectListFor).Но я не мог понять, как это сделать.Это заставило меня взглянуть на простой Html.SelectList метод.

Так как он хочет IEnumerable<SelectListITem>, и я не хочу добавлять специфическую логику представления в мой контроллер или логику в моем представлении, я в итоге создалследующий метод расширения:

public static class ExtensionMethods
{
    public static IEnumerable<SelectListItem> ToSelectList<T>(this IEnumerable<T> items, Func<T, string> valueSelector, Func<T, string> textSelector)
    {
        return items.Select(item => new SelectListItem
                                        {
                                            Text = textSelector(item),
                                            Value = valueSelector(item)
                                        }).ToList();
    }

}

который я использую как:

@Html.DropDownList("trainid", Model.ToSelectList(item => item.Id, item => item.Name));

Это не является оптимальным решением.Как я должен был сделать?

Ответы [ 3 ]

1 голос
/ 29 мая 2011

Думаю, ответ таков: я уже использую лучшее решение.

0 голосов
/ 11 мая 2011

Мне очень нравится этот подход.Я сделал одно изменение, чтобы добавить параметр выбранного элемента.

public static IEnumerable<SelectListItem> ToSelectList<T>(this IEnumerable<T> items, Func<T, string> value, Func<T, string> text, object selectedValue)
    {
        return items.Select(item => new SelectListItem
                                     {
                                         Text = text(item),
                                         Value = value(item),
                                         Selected = (selectedValue.ToString() == value(item))
                                     });
    }

Кроме того, я смог использовать этот код с Html.DropDownListFor, что полностью исключило необходимость использования магических строк:

Html.DropDownListFor(x => x.ContractId, Model.Contracts.ToSelectList(x => x.Value, x => x.Disp, Model.ContractId))
0 голосов
/ 10 мая 2011

jg,

Как ни странно, я должен был найти подобную статью, когда искал решение, подобное этому.у меня есть метод extn, который идет:

public static IList<SelectListItem> ToSelectItemList<T>(
    this IEnumerable<T> list, 
    Func<T, string> textSelector, 
    Func<T, string> valueSelector, T selected) where T : class
{
    var results = new List<SelectListItem>();
    if (list != null)
    {
        results.AddRange(
            list.Select(item => new SelectListItem
            {
                Text = textSelector.Invoke(item), 
                Value = valueSelector.Invoke(item), 
                Selected = selected != null ? selected.Equals(item) : false
            }));
    }
     return results;
}

и вызывается как:

<%: Html.DropDownList("Base.EntityRootID", Model.EntityRootList.ToSelectItemList(foo => foo.EntityName, foo => foo.ID.ToString(), Model.Base.EntityRoot))%>

как странно.Мне действительно нравится этот метод, так как он является общим и использует сам объект для сравнения выбранного элемента. Это означает, что вы не можете сравнивать идентификаторы и т. д.*

...