轻松显示表格化数据

本文关键字:数据 表格 显示 | 更新日期: 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">&nbsp;</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")