2010-04-20 12 views
5

Sto restituendo un IList al mio modello di dati sugli utenti. Voglio che i miei utenti finali siano in grado di selezionare le colonne che vogliono vedere.Aggiunta dinamica di colonne a una tabella in una vista ASP.NET MVC

So che posso farlo con un'enorme "istruzione if", tuttavia, so che ci deve essere un modo migliore.

Ho creato un Enum con i nomi delle colonne. Sento che se potessi prendere l'IListItem.EnumName sarei impostato. Tuttavia, non sono troppo sicuro su come farlo.

Suggerimenti?

risposta

5

Ho gestito questo creando un'interfaccia IColumn e quindi un gruppo di classi di colonne che potevano visualizzare correttamente diversi aspetti del mio modello. La vista quindi rende ogni colonna con un semplice ciclo per. Per esempio:

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

Secondo lei si poi fare qualcosa di simile:

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

Questo ha funzionato bene per me!

4

È possibile pensare di utilizzare riflessione:

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

Quindi è possibile accedere facilmente le proprietà attraverso la riflessione e salvare l'elenco delle proprietà selezionata nelle impostazioni utente. È possibile accedere a nome visualizzato attraverso la riflessione troppo (non è qui):

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

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

Non è necessario creare tipi e descrizione supplementari. Gli attributi ti danno il nome visualizzato e la riflessione ti dà la lista. Ecco come funziona ASP.NET MVC. Un meccanismo simile viene utilizzato quando si desidera utilizzare Html.EditorFor (modello) e molti altri in questo framework.

+0

Questo dovrebbe funzionare anche con un modello (rispetto a un modello di vista)? –

+0

@HughSeagraves Sì. – LukLed

Problemi correlati