Могу ли я настроить свое текстовое поле данных в MVC SelectList для использования с HtmlHelper.DropDownList без необходимости создания новой структуры или класса? - PullRequest
11 голосов
/ 23 февраля 2010

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

Код моего контроллера в данный момент:

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

Мой код просмотра сейчас:

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

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

Ответы [ 3 ]

15 голосов
/ 23 февраля 2010

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

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 голосов
/ 23 февраля 2010

Вы можете создать цикл по списку членов, добавив значения в новый список, из которого вы затем создадите 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");

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

4 голосов
/ 16 апреля 2012

Для тех, кто использует LINQ. Вместо:

    var members = MemberService.GetAll();

вы можете использовать:

    ViewBag.MembersList = new SelectList(
    from x in db.members where x.role = 5 select new {x.ID, x.Name, x.Surname, S_Name = x.Surname + " " + x.Name}, 
    "ID", "S_Name");

, а затем используйте ViewBag.MemberList в вашем коде Razor, например

    @Html.DropDownList("MembersList", String.Empty)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...