2010-04-20 3 views
5

Je renvoie un fichier IList à mon modèle de données sur les utilisateurs. Je veux que mes utilisateurs finaux puissent sélectionner les colonnes qu'ils veulent voir.Ajout dynamique de colonnes à une table dans une vue ASP.NET MVC

Je sais que je peux le faire avec une énorme "if", mais je sais qu'il doit y avoir un meilleur moyen.

J'ai créé un Enum avec les noms de colonne. Je pense que si je pouvais prendre le IListItem.EnumName je serais mis. Cependant, je ne suis pas trop sûr de la façon de faire cela.

Suggestions?

Répondre

5

J'ai géré cela en créant une interface IColumn puis un tas de classes de colonnes qui pouvaient correctement afficher différentes facettes de mon modèle. La vue rend ensuite chaque colonne avec une boucle for simple. Par exemple:

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

À votre avis, vous faire quelque chose comme ceci:

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

Cela a bien fonctionné pour moi!

4

Vous pouvez penser à utiliser la réflexion:

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

Ensuite, vous pouvez facilement accéder à des propriétés par la réflexion et enregistrer la liste des biens dans les paramètres utilisateur. Vous pouvez accéder au nom d'affichage par réflexion trop (il est ici):

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

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

Vous ne devez pas créer d'autres types et la description. Les attributs vous donnent le nom d'affichage et la réflexion vous donne la liste. C'est ainsi que fonctionne ASP.NET MVC. Un mécanisme similaire est utilisé lorsque vous voulez utiliser Html.EditorFor (Model) et beaucoup d'autres dans ce framework.

+0

Est-ce que cela devrait aussi fonctionner avec un modèle (vs un modèle de vue)? –

+0

@HughSeagraves Oui. – LukLed

Questions connexes