我希望這樣做的意義與我的想法一樣!
由於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
使用反射? –
相當困難。希望我的回答能夠滿足你的需求。 –