我想创建显示实体属性列表的动态视图。
我创建了这些模型
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; }
}
我想要一个显示列表的视图,动态生成的视图 例如,列和数据显示在列表中。
开放员工的示例我将显示以下内容:
当开放学生时,我将展示以下内容:
使我的视图动态化并包含我想要的列和数据的最简单方法是什么?
答案 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列表并对此进行操作,类似于我为列标题显示的内容。
希望有所帮助。