我希望这样做的意义与我的想法一样!
由于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);
}
}
然后,您需要一个使用此类的通用视图。将这个共享/ 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>
类型或模型的属性您的任何模型的列表。
您可以创建两个由不同型号键入的部分视图,然后在视图中使用该视图。可能会让您的操作方法切换到每个模型并返回到视图。 – Rahul
使用反射? –
相当困难。希望我的回答能够满足你的需求。 –