2011-06-26 16 views
0

私はモデルオブジェクトのリストを表現するテーブルを生成し、指定されたフィールドを列として表示するための軽量テンプレートを考え出しています。これまでのところ、私はいくつかの厄介な問題を抱えています。表形式のデータを簡単に表示できますか?

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">&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; 
     } 
+0

のようにそれを呼び出すことができます。 – iwayneo

答えて

0

: -

UPDATEは私の第二の問題を修正しました。それはかなり良い見えます。

Phil Haackのブログhereのように、表形式の表示テンプレートを設定するのはどうですか?ただ、該当する各テーブルのためのコードを書く - - それはあなたの時間と農業を救う

その後、私は、これは底なしであるようなものを一般化しようとしている見つけるこのHtml.DisplayForModel("TableTemplateName")

関連する問題