ASP.NET MVC3 WebGrid助手和模型元数据

时间:2011-02-02 12:37:33

标签: asp.net-mvc-3 modelmetadata webgrid

我正在尝试使用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将使用反射或其他内容读取属性的值(我需要在此提醒项目是动态的,其值实际上是当前行中显示的对象)。

有没有更好的方法呢?

谢谢,

科斯塔斯

2 个答案:

答案 0 :(得分:2)

我建议你研究一下MVCContrib Grid项目:http://mvccontrib.codeplex.com/wikipage?title=Grid

答案 1 :(得分:0)

不知道你是否仍然需要这个问题的一些帮助,但我遇到了与你一样的问题,这就是我为解决它而做的事情:

  1. 我使用Foreach循环来遍历属性
  2. 使用属性名称
  3. 填充变量
  4. 格式化列
  5. 我得到的代码是这样的:

    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);
    }
    

    我真的不知道这是不是最好的方式,但它对我来说非常好。