4

ASP.NET MVC 3 で WebGrid html ヘルパーを使用して、ModelMetadata にある情報に従って列を自動生成しようとしています。たとえば、オブジェクトのリストを受け入れるビューのコードは次のようになります。

var grid = new WebGrid(Model);
@grid.GetHtml(columns: ViewData.ModelMetadata.Properties.Single.Properties
               .Select(p => grid.Column(
                       columnName: p.PropertyName,
                       header: p.ShortDisplayName
               )));

これは実際に魔法のように機能します (実際にはそれほど簡単であることに驚きました)。ここで起こることは、モデルのプロパティから、ShortDisplayName を列のヘッダーとして使用することです。

問題?すべての列にデフォルトのフォーマットを適用する必要があります。基本的に、グリッドが表示するすべてのデータに Html.Raw 拡張子を使用したいと考えています。試行は次のようになります。

var grid = new WebGrid(Model);
@grid.GetHtml(columns: ViewData.ModelMetadata.Properties.Single.Properties
               .Select(p => grid.Column(
                       columnName: p.PropertyName,
                       header: p.ShortDisplayName,
                       format: (item) => Html.Raw(GetPropertyValue(item, p.PropertyName))
               )));

メソッド GetPropertyValue は、リフレクションなどを使用してプロパティの値を読み取ります (アイテムは動的であり、その値は実際には現在の行に表示されているオブジェクトであることをここで思い出してください)。

これを行うより良い方法はありますか?

ありがとう、

コスタス

4

2 に答える 2

2

I suggest you looking into MVCContrib Grid project: http://mvccontrib.codeplex.com/wikipage?title=Grid

于 2012-01-08T08:34:05.130 に答える
0

この質問についてまだ助けが必要かどうかはわかりませんが、私はあなたと同じような問題を抱えていて、それを解決するために私がしたことです:

  1. Foreach ループを使用して、プロパティを反復処理しました
  2. プロパティの名前で変数を埋めました
  3. 列をフォーマットしました

私が得たコードは次のようなものでした:

var columns = List<WebGridColumn>();
foreach (var p in ViewData.ModelMetadata.Properties.Single.Properties) {
   String propertyName = p.PropertyName;
   columns.Add(grid.Column(p.PropertyName, p.ShortDisplayName, format: item => Html.Raw(GetPropertyValue(item.Value, propertyName))));
}
@grid.GetHtml(columns: columns.ToArray());

そして、それがプロパティの値を取得する方法です:

public static object GetPropertyValue(object obj, String propertyName)
{
    if (propertyName.Contains("."))
    {
        int index = propertyName.IndexOf(".");
        object prop = obj.GetType().GetProperty(propertyName.Substring(0, index)).GetValue(obj, null);
        return GetPropertyValue(prop, propertyName.Substring(index + 1));
    }

    return obj.GetType().GetProperty(propertyName).GetValue(obj, null);
}

これが最善の方法かどうかはわかりませんが、私にとってはかなりうまく機能しています。

于 2013-01-21T14:10:03.913 に答える