高级ASP.NET WebGrid - 动态列和行

时间:2012-03-13 05:16:46

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

我正在尝试创建一个必须非常动态的WebGrid。列是在列表中定义的,我已经这样做了:

@{
    List<WebGridColumn> columns = new List<WebGridColumn>();
    foreach (var column in Model.Columns)
    {
        columns.Add(new WebGridColumn() { ColumnName = column.Name, Header = column.Name });
    }
}

@grid.GetHtml(
    columns: columns)

一切都很好,但我遇到的问题是行。我会试着解释一下......

对于这个问题,我们假设我们有两列名称地址

我有一个行对象集合,比方说就是SearchResult对象。 SearchResult包含任意数量属性的字典,例如姓名,地址,电话,身高,胸罩尺寸或任何东西(想想EAV模式)。我需要根据列名访问属性。

我想我可以使用格式来做到这一点,但我似乎无法弄明白。我想要这样的东西:

columns.Add(new WebGridColumn() { ColumnName = column.Name, Header =
    column.Header, Format = @<text>@item.Attributes[column.Name]</text> });

这种方法有效但是尽管为单独的列创建了格式,但行只填充了最后一列的格式。即:

Name            Address
1 Main Street   1 Main Street
45 Paradise Av  45 Paradise Av

2 个答案:

答案 0 :(得分:1)

我认为如果省略“ColumnName”(无论如何都是多余的),它应该有效,并且还使动态表达更加明确:

columns.Add(
   new WebGridColumn() { 
      Header = column.Header, 
      Format = (item) => @Html.Raw("<text>" + @item.Attributes[column.Name] + "</text>")
   }
);

答案 1 :(得分:1)

此问题与参考变量有关。您需要根据WebGridColumn的其他属性具有Format属性。我就是这样做的:

@{
    List<WebGridColumn> columns = new List<WebGridColumn>();
    foreach (var column in Model.Columns)
    {
        var col = new WebGridColumn();
        col.Header = column.Name;
        col.Format = (item) => @Html.Raw("<text>" + @item.Attributes[col.Header] +  "</text>");
        columns.Add(col);
    }
}