2011-02-02 50 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); 
} 

我真的不知道這是否是最好的方法,但它對我來說工作很好。