Я возвращаю IList своей модели данных о пользователях. Я хочу, чтобы мои конечные пользователи смогли выбрать, какие столбцы они хотят видеть.
Я знаю, что могу сделать это с огромным, "если оператор" однако, я знаю, что должен быть лучший путь.
Я создал Перечисление с именами столбцов. Я чувствую, мог ли я взять IListItem. EnumName я был бы установлен. Однако я не слишком уверен в том, как сделать это.
Предложения?
Я решил это, создав интерфейс IColumn и затем набор классов столбцов, которые могут правильно отображать разные аспекты моей модели. Затем представление отображает каждый столбец с помощью простого цикла for. Например:
public interface IColumn
{
string Title { get; }
string Render(MyModelObject obj);
}
public class NameColumn : IColumn
{
public string Title { get { return "Name"; } }
public string Render(MyModelObject obj)
{
return obj.Name;
}
}
На ваш взгляд, вы делаете что-то вроде этого:
<tr>
<% foreach (var column in Model.UserColumns) { %>
<th><%= column.Title %></th>
<% } %>
</tr>
<% foreach (var item in Model.Items) { %>
<tr>
<% foreach (var column in Model.UserColumns) { %>
<td><%: column.Render(item) %></td>
<% } %>
</tr>
<% } %>
У меня это хорошо работает!
Вы можете подумать об использовании отражения:
class UserViewModel
{
[DisplayName("User name")]
public string UserName { get; set; }
[DisplayName("E-mail address")]
public string Email { get; set; }
[DisplayName("Age")]
public int Age { get; set; }
}
Затем вы можете легко получить доступ к свойствам через отражение и сохранить выбранный список свойств в пользовательских настройках. Вы также можете получить доступ к отображаемому имени через отражение (его здесь нет):
var type = typeof(UserViewModel);
var properties = type.GetProperties();
foreach (PropertyInfo property in properties)
{
Console.WriteLine(property.Name);
}
Вам не нужно создавать дополнительные типы и описание. Атрибуты дают вам отображаемое имя, а отражение дает вам список. Так работает ASP.NET MVC. Аналогичный механизм используется, когда вы хотите использовать Html.EditorFor (Model) и многие другие в этой структуре.