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

我建议您查看 MVCContrib Grid 项目: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 回答