2010-04-20 9 views
5

Ich gebe eine IList an mein Modell von Daten über Benutzer zurück. Ich möchte, dass meine Endbenutzer auswählen können, welche Spalten sie sehen möchten.Dynamisches Hinzufügen von Spalten zu einer Tabelle in einer ASP.NET MVC-Ansicht

Ich weiß, dass ich das mit einer riesigen "if-Aussage" tun kann, aber ich weiß, dass es einen besseren Weg geben muss.

Ich habe eine Enum mit den Spaltennamen erstellt. Ich fühle, wenn ich den IListItem.EnumName nehmen könnte, würde ich gesetzt werden. Ich bin mir aber nicht sicher, wie ich das machen soll.

Vorschläge?

Antwort

5

Ich behandelte dies, indem ich eine IColumn-Schnittstelle und dann eine Reihe von Spaltenklassen erstellte, die verschiedene Facetten meines Modells korrekt anzeigen konnten. Die Ansicht rendert dann jede Spalte mit einer einfachen for-Schleife. Zum Beispiel:

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

Ihrer Ansicht nach tun Sie dann so etwas wie dieses:

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

Das hat gut für mich gearbeitet!

4

können Sie darüber nachdenken, Reflexion mit:

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

Dann können Sie einfach die Eigenschaften durch Reflexion zugreifen und ausgewählte Eigenschaftsliste in Benutzereinstellungen speichern. Sie können auch Anzeigename durch Reflexion zugreifen (es ist nicht hier):

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

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

Sie müssen keine zusätzlichen Typen und Beschreibung erstellen. Attribute geben Ihnen Anzeigename und Reflexion gibt Ihnen eine Liste. So funktioniert ASP.NET MVC. Ein ähnlicher Mechanismus wird verwendet, wenn Sie Html.EditorFor (Model) und viele andere in diesem Framework verwenden möchten.

+0

Sollte dies auch mit einem Modell (gegenüber einem Ansichtsmodell) funktionieren? –

+0

@HughSeagraves Ja. – LukLed

Verwandte Themen