MVC 3 WebGrid具有动态源

时间:2012-07-13 14:11:42

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

我有一个动态的数据列表,其中包含由PIVOT函数创建的动态列数。一切都或多或少有效,但我想在一些列中应用一些自定义格式。我想出了如何获取列的列表,只需取第一行并像这样投射它:

var columns = Model.Comparisons.Select(x => x).FirstOrDefault() as IDictionary<string, object>;

接下来我决定通过循环遍历&#34;列&#34;来创建我的列表,只要我引用&#34;格式的动态字段,它就会起作用:&#34;例如,通过动态字段名称的子句,例如:

foreach (var c in columns)
{
    switch (c.Key)
    {
        case "Cost":
            cols.Add(grid.Column(
            columnName: c.Key,
            header: c.Key,
            format: (item) => Convert.ToDecimal(item.Cost).ToString("C")));
            break;
        default:
            cols.Add(grid.Column(columnName: c.Key, header: c.Key, format: item => item[c.Key]));
            break;
    }
}

&#34;默认&#34;不会动态获取每条记录的值。我认为这与&#34;项目有关[c.Key]&#34; vs item.Cost。问题是我不想为每个字段编写不同的案例,主要是因为我不能提前知道它们,因为数据可能会发生变化。大约有6个领域将永远存在。我确实知道数据类型,这就是我想在它们上面放置自定义格式的原因。

修改

我设法通过编写扩展方法来解决这个问题。

public static class DynamicDataHelper
{
    public static WebGridColumn GetColumn(this HtmlHelper helper, string vendor)
    {
        return new WebGridColumn()
        {
            ColumnName = vendor,
            Header = vendor,
            Format = (item) => helper.ActionLink(
                (string)Convert.ToDecimal(item[vendor]).ToString("C"),
                "VendorSearch",
                "Compare",
                new { Vendor = vendor, mpn = item.MPN },
                new { target = "_blank" })
        };
    }
}

1 个答案:

答案 0 :(得分:0)

我使用我编写的Html Helper编辑了我的帖子,这实际上构建了我遇到问题的自定义WebGridColumn对象。 “供应商”从View传入,然后在运行时解析。它很棒。