轻松显示表格化数据
本文关键字:数据 表格 显示 | 更新日期: 2023-09-27 18:00:19
我正在尝试开发一个轻量级模板,用于生成一个表来表示模型对象的列表,并将指定的字段显示为列。到目前为止,这就是我所想到的,还有一些令人讨厌的问题。
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.chtml:
@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;
}
我想你基本上已经做到了。它看起来很不错。
根据Phil Haack的博客,设置一个表格显示模板怎么样?
然后你可以这样称呼它Html.DisplayForModel("TableTemplateName")