Я могу настроить свое текстовое поле данных в MVC SelectList для использования с HtmlHelper. DropDownList, не имея необходимость создавать новую структуру или класс?

Я создаю SelectList из Списка (T) класс для использования для заполнения HtmlHelper. DropDownList в представлении MVC, устанавливая dataValueField и dataTextField в конструкторе Списка выборки. Текст, который должен быть отображен, не делает excatly, соответствуют одному из свойств на моем классе и все еще должен управляться. Есть ли какой-либо способ сделать это через конструктора SelectList? Я понимаю, что мог сделать это путем создания структуры или класса для использования в качестве входа IEnumerable для Списка выборки, но я предпочту не, если я не должен буду.

Мой код Контроллера в настоящее время:

        var members = MemberService.GetAll();
        this.ViewData["Members"] = new SelectList(members, "Id", "Name");

Мой код Представления в настоящее время:

        <%= Html.DropDownList("Members") %>

Вместо "Фамилии" как мое поле дисплея я хотел бы иметь возможность предварительно отформатировать поле путем объединения (и форматирования) два свойства.

11
задан Val M 23 February 2010 в 16:10
поделиться

2 ответа

Вы можете создать цикл по списку членов, добавляя значения в новый список, из которого затем создается SelectList. Что-то вроде:

var members = MemberService.GetAll();
List<object> newList = new List<object>();
foreach(var member in members)
    newList.Add( new { 
        Id = member.Id, 
        Name = member.Name + " " + member.Surname 
    } );
this.ViewData["Members"] = new SelectList(newList, "Id", "Name");

Я не помню, можно ли использовать анонимный тип или нет, но если нет, то можно создать небольшой класс данных для использования в качестве посредника.

16
ответ дан 3 December 2019 в 02:01
поделиться

Вы можете создать метод расширения и задать в качестве текста все, что захотите. Это может быть что-то вроде

public static IList<SelectListItem> ToSelectList<T>(this IEnumerable<T> itemsToMap, Func<T, string> textProperty, Func<T, string> valueProperty, Predicate<T> isSelected)
{
    var result = new List<SelectListItem>();

    foreach (var item in itemsToMap)
    {
        result.Add(new SelectListItem
        {
            Value = valueProperty(item),
            Text = textProperty(item),
            Selected = isSelected(item)
        });
    }
    return result;
}

Затем вы вызываете этот метод как:

var membersSelectList = MemberService.GetAll().ToSelectList(m=>m.FirstName + " " + m.Surname, m.Id.ToString(), m=>m.Id < -1); //Any predicate you need here.
15
ответ дан 3 December 2019 в 02:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: