Как кодировать метод расширения C #, чтобы превратить объект модели домена в объект интерфейса? - PullRequest
5 голосов
/ 07 апреля 2010

Если у вас есть объект домена, который должен отображаться как элемент управления интерфейса, например, раскрывающийся список, ifwdev предложил создать метод расширения для добавления .ToSelectList ().

Исходный объект - это список объектов, свойства которых идентичны свойствам .Text и .Value раскрывающегося списка.По сути, это список объектов SelectList, но не с тем же именем класса.

Я думаю, вы могли бы использовать отражение, чтобы превратить объект домена в объект интерфейса.Кто-нибудь есть какие-либо предложения для кода C #, которые могли бы сделать это?SelectList - это выпадающий список MVC SelectListItem.

Идея, конечно, состоит в том, чтобы сделать что-то подобное в представлении:

<%= Html.DropDownList("City", 
         (IEnumerable<SelectListItem>) ViewData["Cities"].ToSelectList() )

Ответы [ 2 ]

4 голосов
/ 07 апреля 2010

Это два метода расширения, которые я использую для создания списков выбора.

public static IEnumerable<SelectListItem> ToSelectList<T>(this IEnumerable<T> collection, Func<T, string> text, Func<T, string> value)
{
    return collection.ToSelectList(text, value, x => false);
}

public static IEnumerable<SelectListItem> ToSelectList<T>(this IEnumerable<T> collection, Func<T, string> text, Func<T, string> value, Func<T, bool> selected)
{
    return (from item in collection
            select new SelectListItem()
                       {
                           Text = text(item),
                           Value = value(item),
                           Selected = selected(item)
                       });
}

HTH,
Charles

4 голосов
/ 07 апреля 2010

Проще сделать SelectList частью вашего ViewModel объекта.

В любом случае, вам просто нужно пройтись по IEnumerable, добавить каждый элемент в новый объект SelectList и вернуть его.

public static List<SelectListItem> ToSelectList<T>(this IEnumerable<T> enumerable, Func<T, string> text, Func<T, string> value, string defaultOption) 
{ 
    var items = enumerable.Select(f => new SelectListItem() { Text = text(f), Value = value(f) }).ToList(); 
    items.Insert(0, new SelectListItem() { Text = defaultOption, Value = "-1" }); 
    return items; 
} 

Как объединить эти 2 аналогичных метода в один?

...