Я создаю 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") %>
Вместо "Фамилии" как мое поле дисплея я хотел бы иметь возможность предварительно отформатировать поле путем объединения (и форматирования) два свойства.
Вы можете создать цикл по списку членов, добавляя значения в новый список, из которого затем создается 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");
Я не помню, можно ли использовать анонимный тип или нет, но если нет, то можно создать небольшой класс данных для использования в качестве посредника.
Вы можете создать метод расширения и задать в качестве текста все, что захотите. Это может быть что-то вроде
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.