动态地将列添加到ASP.NET MVC视图中的表

时间:2010-04-20 20:33:39

标签: c# asp.net asp.net-mvc dynamic

我将IList返回到我的用户数据模型。我希望我的最终用户能够 选择他们想要查看的列。

我知道我可以用一个巨大的“if语句”来做到这一点但是,我知道必须有更好的方法。

我创建了一个包含列名的Enum。我觉得如果我可以使用IListItem.EnumName我将被设置。但是,我不太清楚如何做到这一点。

建议?

2 个答案:

答案 0 :(得分:5)

我通过创建一个IColumn接口,然后是一堆可以正确显示我的模型的不同方面的列类来处理这个问题。然后视图使用简单的for循环呈现每个列。例如:

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

在您看来,您可以这样做:

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

这对我来说效果很好!

答案 1 :(得分:4)

你可以考虑使用反射:

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

然后,您可以通过反射轻松访问属性,并在用户设置中保存选定的属性列表。您也可以通过反射访问显示名称(它不在这里):

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

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

您不必创建其他类型和说明。属性为您提供显示名称,反射为您提供列表。这就是ASP.NET MVC的工作原理。当你想在这个框架中使用Html.EditorFor(Model)和许多其他机制时,会使用类似的机制。