2010-04-20 11 views
5

Zwracam IList do mojego modelu danych o użytkownikach. Chcę, aby moi użytkownicy końcowi mogli wybrać kolumny, które chcą zobaczyć.Dynamiczne dodawanie kolumn do tabeli w widoku ASP.NET MVC

Wiem, że mogę to zrobić z wielką "instrukcją", ale wiem, że musi istnieć lepszy sposób.

Utworzyłem Enum z nazwami kolumn. Czuję, że gdybym mógł wziąć IListItem.EnumName, zostałabym ustawiona. Jednak nie jestem zbyt pewien, jak to zrobić.

Sugestie?

Odpowiedz

5

Zajmowałem się tym, tworząc interfejs IColumn, a następnie kilka klas kolumn, które mogą poprawnie wyświetlać różne aspekty mojego modelu. Widok następnie renderuje każdą kolumnę za pomocą prostej pętli for. Na przykład:

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; 
    } 
} 

W widoku wtedy zrobić coś takiego:

<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> 
<% } %> 

Zostało to działa dobrze dla mnie!

4

Można myśleć o użyciu odbicia:

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; } 
} 

Następnie można łatwo uzyskać dostęp do właściwości poprzez odbicie i zapisać wybraną listę właściwość w ustawieniach użytkownika. Możesz również uzyskać dostęp do nazwy wyświetlanej za pomocą odbicia (nie ma jej tutaj):

var type = typeof(UserViewModel); 
var properties = type.GetProperties(); 

foreach (PropertyInfo property in properties) 
{ 
    Console.WriteLine(property.Name); 
} 

Nie musisz tworzyć dodatkowych typów i opisu. Atrybuty dają wyświetlaną nazwę, a odbicie daje listę. Tak działa ASP.NET MVC. Podobny mechanizm jest używany, gdy chcesz używać Html.EditorFor (Model) i wielu innych w tym szkielecie.

+0

Czy to też powinno działać z modelem (w porównaniu z modelem widoku)? –

+0

@HughSeagraves Tak. – LukLed

Powiązane problemy