2011-02-02 38 views
4

我想在ASP.NET MVC 3中使用WebGrid html helper根据ModelMetadata中的信息自动生成列。例如,在一个观点,即接受对象的列表的代码如下:ASP.NET MVC3 WebGrid帮手和模型元数据

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将使用反射或任何(我在这里需要提醒的是,项目是动态的,它的价值实际上是作为对象读取属性的值显示在当前行中)。

有没有更好的方法来做到这一点?

感谢,

科斯塔斯·

+0

好问题kkara! – Rookian 2011-03-04 22:53:50

回答

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

我真的不知道这是否是最好的方法,但它对我来说工作很好。