私はモデルオブジェクトのリストを表現するテーブルを生成し、指定されたフィールドを列として表示するための軽量テンプレートを考え出しています。これまでのところ、私はいくつかの厄介な問題を抱えています。表形式のデータを簡単に表示できますか?
DataTable.cs:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
namespace Models
{
public interface IDataTable
{
List<string> ColumnNames { get; }
List<List<string>> TableRows { get; }
}
public class DataTable<T> : IDataTable
{
private Type TableType = typeof(T);
public List<string> Columns { get; set; }
public List<T> RowData { get; set; }
public List<string> ColumnNames
{
get
{
List<string> columnNames = new List<string>();
foreach (string colPropName in Columns)
columnNames.Add(GetPropertyDisplayName(colPropName));
return columnNames;
}
}
public List<List<string>> TableRows
{
get
{
List<List<string>> tableRows = new List<List<string>>();
foreach (T rowObj in RowData)
{
List<string> tableRow = new List<string>();
foreach (string propName in Columns)
{
object value = TableType.GetProperty(propName).GetValue(rowObj, null);
if (value != null && value != String.Empty)
tableRow.Add(value.ToString());
else
tableRow.Add("N/A");
}
tableRows.Add(tableRow);
}
return tableRows;
}
}
public DataTable(List<string> columns, List<T> rowData)
{
Columns = columns;
RowData = rowData;
}
private string GetPropertyDisplayName(string propName)
{
DisplayNameAttribute attrib = TableType.GetProperty(propName).GetCustomAttributes(true).OfType<DisplayNameAttribute>().FirstOrDefault();
if (attrib != null)
return attrib.DisplayName;
return propName;
}
}
}
共有/ DataTable.cshtml:
@model IDataTable
<table class="rounded-corner-table" summary="2007 Major IT Companies' Profit">
<thead>
<tr>
@foreach (string colName in Model.ColumnNames)
{
<th scope="col">@colName</th>
}
</tr>
</thead>
<tfoot>
<tr>
<td colspan="@(Model.ColumnNames.Count - 1)" class="rounded-foot-left"><em>To be implemented: Instant search.</em></td>
<td class="rounded-foot-right"> </td>
</tr>
</tfoot>
<tbody>
@for (int i = 0; i < Model.TableRows.Count; ++i)
{
<tr>
@foreach (string colValue in Model.TableRows[i])
{
<td>@colValue</td>
}
</tr>
}
</tbody>
</table>
私はそれらを使用する方法:
public ActionResult List()
{
return PartialView(new DataTable<Administrator>(new List<string> { "EmailAddress",
"FirstName",
"LastName",
"Date" },
Root.DataContext.Administrators.ToList()));
}
//_______________________________________________________________________________
@model DataTable<Administrator>
@{Html.RenderPartial("DataTable");}
私はこれがあると持っています二つの主要な問題私はHtml.DisplayForModel()
に電話することを好むだろうが、それを動作させる方法がわからず、それを表示していない表内の列名のDisplayName属性。誰かが私にこれらの問題についていくつかアドバイスをしてくれますか?
ありがとう、 アレックス。私は、あなたはかなりある数える
private string GetPropertyDisplayName(string propName)
{
DisplayNameAttribute attrib = TableType.GetProperty(propName).GetCustomAttributes(true).OfType<DisplayNameAttribute>().FirstOrDefault();
if (attrib == null)
{
MetadataTypeAttribute metaAttrib = TableType.GetCustomAttributes(true).OfType<MetadataTypeAttribute>().FirstOrDefault();
if (metaAttrib != null)
attrib = metaAttrib.MetadataClassType.GetProperty(propName).GetCustomAttributes(true).OfType<DisplayNameAttribute>().FirstOrDefault();
}
if (attrib != null)
return attrib.DisplayName;
return propName;
}
のようにそれを呼び出すことができます。 – iwayneo