在MVC中创建动态视图作为列表

时间:2016-01-06 15:41:39

标签: c# asp.net-mvc razor

我想创建显示实体属性列表的动态视图。

我创建了这些模型

  public class PersonModel
{
    public string FirstName { get; set; }
    public string LastName { get; set; }

}

  public class EmployeeModel : PersonModel
    {
        public string CompanyName { get; set; }

      }

 public class StudentModel : PersonModel
    {
        public string SchoolName { get; set; }

    }

我想要一个显示列表的视图,动态生成的视图 例如,列和数据显示在列表中。

开放员工的示例我将显示以下内容:

enter image description here

当开放学生时,我将展示以下内容:

enter image description here

使我的视图动态化并包含我想要的列和数据的最简单方法是什么?

2 个答案:

答案 0 :(得分:2)

我希望这与我认为的一样有意义!

由于List<PersonModel>List<EmployeeModel>List<StudentModel>实际上被视为完全不同,因此您需要一种方法来克服该问题。我使用通用容器类:

public interface IGenericContainer
{
    dynamic Data { get; }
}

public class GenericContainer<T> : IGenericContainer
{
    T _Data { get; set; }
    public GenericContainer(T data)
    {
        _Data = data;
    }
    dynamic IGenericContainer.Data
    {
        get { return _Data; }
    }
}

public class GenericContainer
{
    public static GenericContainer<T> Create<T>(T data)
    {
        return new GenericContainer<T>(data);
    }
}

然后您需要一个使用它的通用视图。把它放在Shared / DisplayTemplates / GenericGrid.cshtml

@using System.Reflection;
@using System.Text;
@{
    Layout = null;
}
@model IGenericContainer
@{
    IEnumerable<PropertyInfo> properties = null;
    if (Model.Data.Count > 0)
    {
        properties = Model.Data[0].GetType().GetProperties();
    }
}
<div>
@if (properties != null)
{
    <table>
        <thead>
            <tr>
                @foreach (var prop in properties)
                {
                    <td>@prop.Name</td>
                }
            </tr>
        </thead>
        <tbody>
            @for (int i = 0; i < Model.Data.Count; i++)
            {
                <tr>
                @foreach (var prop in properties)
                {
                    <td>@prop.GetValue(Model.Data[i])</td>
                }
                </tr>
            }
        </tbody>
    </table>
}
</div>

要使用此功能,您需要将其添加到视图中:

@Html.DisplayFor(m => GenericContainer.Create(Model.PersonList), "GenericGrid")

PersonList是您的模型List<PersonModel>中的属性或任何模型的列表。

答案 1 :(得分:1)

我不确定我是否已正确理解您的要求,但如果您想要动态显示模型的每个属性作为列标题,那么您可以尝试以下操作:

在您的视图中,您可以在类型上调用GetProperties方法并以递归方式为每个属性添加一列:

@model PersonModel
@if (Model != null)
{
    <table style="width:100%">
        <tr>
            @foreach (string property in Model.GetType().GetProperties().Select(x => x.Name).ToList())
            {
            <td>@property</td>
            }
        </tr>
    </table>
}

您可以使用此示例在填充行之前填充表的标题列。要填充行,您需要一个PersonModel列表并对此进行操作,类似于我为列标题显示的内容。

希望有所帮助。