1

これを行うためのきれいな方法を見つけるのに苦労しています。ViewModelテーブルの行のコレクションを含むクラスがあります。コレクション内の最初のアイテムを参照したり、タイプの新しいインスタンスを作成したりせずに、コレクション@Html.DisplayNameFor()内のタイプを実行できるようにしたいと考えています。strongly-typed明確にするために、例を次に示します。

public class TableViewModel
{
  public string Title { get; set; }
  public IEnumerable<Row> Rows { get; set; }
}

public class Row
{
  public int ColumnA { get; set; }
  public int ColumnB { get; set; }
}

//In the Razor view
<table>
  <tr>
    <th>@Html.DisplayNameFor(???)</th>
  </tr>
</table>

せずにこれを行う方法はあり@Html.DisplayNameFor(x => x.Rows.First().ColumnA)ますか?

4

2 に答える 2

1

コレクションを使用してメソッドをthis.ViewData.ModelMetadata.Properties呼び出しGetDisplayName、ヘッダー セルのコンテンツを生成できます。これをコードで一般的に行い、任意のモデルをテーブルとしてレンダリングします。

編集:これを拡張するために、テーブルとテーブルのみを表す基本モデルを使用します。私は3つのクラスを定義しています。TableRowCell' class, aTableRow' クラス (基本的にはオブジェクトのコレクション)TableRowCellTableクラスがあります。

public class Table
{
    public Table(String name)
    {
        this.Name = name;
        this.ContentRows = new List<TableRow>();
        this.HeaderRow = new TableRow();
        this.FooterRow = new TableRow();
    } 

    public IList<TableRow> ContentRows
    {
        get;
        private set;
    }

    public TableRow FooterRow
    {
        get;
        private set;
    }

    public TableRow HeaderRow
    {
        get;
        private set;
    }

    public String Name
    {
        get;
        private set;
    }
}

テーブルに表示したいオブジェクトのコレクションを含むビュー モデルがある場合、最初にHtmlHelperそのコレクションをオブジェクトに変換する拡張機能を呼び出しTableます。ModelMetadataProviders.Current.GetMetadataForType(null, typeof(TModel)).Properties..Where(item => item.ShowForDisplay)そのメソッド内で、ヘッダー セルの生成に使用されるメタデータ オブジェクトのコレクションを取得するための呼び出しを反復処理します。次に、アイテムのコレクションを繰り返し処理し、呼び出しModelMetadataProviders.Current.GetMetadataForType(() => item, typeof(TModel)).Properties..Where(item => item.ShowForDisplay)て、コンテンツ セルの生成に使用されるメタデータ オブジェクトのコレクションを取得します。

技術的には、私のHtmlHelper拡張メソッドは実際には、html を生成するTableBuilderメソッドが呼び出されるオブジェクトを返します。Renderその設定は、これまでのところうまく機能しています。

于 2013-01-28T21:20:00.393 に答える
0
public class TableViewModel
{
  public string Title { get; set; }
  public IEnumerable<Row> Rows { get; set; }
  public Row ForNames = null;
}


@Html.DisplayNameFor(x => x.ForName.ColumnA)
于 2013-01-28T20:59:22.517 に答える