2010-04-20 32 views
5

Estoy devolviendo un IList a mi modelo de datos sobre usuarios. Quiero que mis usuarios finales puedan seleccionar qué columnas quieren ver.Agregando dinámicamente columnas a una tabla en una vista MVC de ASP.NET

Sé que puedo hacer esto con una gran "declaración de si", sin embargo, sé que debe haber una mejor manera.

He creado un Enum con los nombres de las columnas. Siento que si pudiera tomar el IListItem.EnumName estaría configurado. Sin embargo, no estoy muy seguro de cómo hacer esto.

Sugerencias?

Respuesta

5

Manejé esto creando una interfaz IColumn y luego un grupo de clases de columnas que podrían mostrar correctamente las diferentes facetas de mi modelo. La vista luego representa cada columna con un bucle simple. Por ejemplo:

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

En su opinión, a continuación, hacer algo como esto:

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

Esto ha funcionado bien para mí!

4

Se puede pensar acerca del uso de la reflexión:

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

A continuación, se puede acceder fácilmente a través de las propiedades de reflexión y guardar la lista de propiedades seleccionado en la configuración del usuario. Se puede acceder a través de la reflexión nombre de visualización también (no es aquí):

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

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

Usted no tiene que crear tipos y descripción adicionales. Los atributos le dan nombre para mostrar y la reflexión le da una lista. Así es como funciona ASP.NET MVC. Mecanismo similar se utiliza cuando desea utilizar Html.EditorFor (Modelo) y muchos otros en este marco.

+0

¿Esto también debería funcionar con un modelo (frente a un modelo de vista)? –

+0

@HughSeagraves Sí. – LukLed

Cuestiones relacionadas