Динамично добавляющие столбцы к таблице в представлении ASP.NET MVC

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

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

Я создал Перечисление с именами столбцов. Я чувствую, мог ли я взять IListItem. EnumName я был бы установлен. Однако я не слишком уверен в том, как сделать это.

Предложения?

6
задан Sara Chipps 20 April 2010 в 20:33
поделиться

2 ответа

Я решил это, создав интерфейс 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>
<% } %>

У меня это хорошо работает!

5
ответ дан 10 December 2019 в 02:44
поделиться

Вы можете подумать об использовании отражения:

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) и многие другие в этой структуре.

4
ответ дан 10 December 2019 в 02:44
поделиться
Другие вопросы по тегам:

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