エンティティプロパティのリストを表示する動的ビューを作成したいと思います。
これらのモデルを作成します
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; }
}
リストを表示する1つのビューが必要です。例の列とデータに対して動的に生成されたビューが、リストに表示されます。
従業員を開いたときの例以下を示します。
そして、学生を開くとき、私は以下を示します:
ビューを動的にし、必要な列とデータを含める最も簡単な方法は何ですか?
これが私が思うのと同じくらい理にかなっていることを願っています!
そして実際に完全に異なると考えられている、あなたはその問題を克服する方法が必要になります。私は汎用コンテナクラスを使用します: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>
または任意のモデルのリストのプロパティです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加