将MVC WebGrid列绑定到源的字典属性值

时间:2014-02-05 14:49:56

标签: c# asp.net asp.net-mvc asp.net-mvc-4 webgrid

我在我的应用程序中使用MVC的WebGrid,它一直很好用。我在控制器代码中设置网格的列,然后将其传递给我的视图。我添加了一个新列,其中columnsList<MvcWebGridColumn>

columns.Add(new WebGridColumn { ColumnName = "Path", Header = "Full Path", Filter = ... });

然后在我看来,我从我的视图模型中设置了网格列:

@grid.GetHtml(
    footerStyle: "hide",
    mode: WebGridPagerModes.All,
    htmlAttributes: new { id = @Model.Id },
    columns: @Model.Columns)

到目前为止,设置代码中的列已经很有效,因为已知列,我的模型的第一级属性。现在情况更复杂,我不知道如何使用WebGrid处理它。这是一个示例模型:

public class Requirement
{
    public string Id { get; set; }
    public string Path { get; set; }
    public Dictionary<string, string> Fields { get; set; }
}

我希望能够使用Field字典属性键中的值在代码中设置WebGrid列。我正在尝试这个,但它不起作用:

columns.Add(new WebGridColumn { ColumnName = String.Format("Fields[\"{0}\"]", key), Header = label });

我还尝试在我的GetFieldValue(string key)模型上放置方法Requirement,但它也不喜欢这样。它似乎只能处理与对象的属性标识符完全匹配。

我不确定这是否可以使用WebGrid开箱即用,或者我是否必须扩展功能。提前谢谢。

1 个答案:

答案 0 :(得分:0)

我相信我想出了一种方法来处理这个看似不太讨厌的事情。

为了重申这个问题,我相信MVC WebGrid使用反射来设置ColumnName属性,因此您输入的字符串需要通过对象的API直接访问,例如。 "Id""Field.Address.Name"等。在我的情况下,问题是我的列的行需要的值来自一个字典,它似乎不能传递参数(键,索引,等)进入ColumnName以获得我需要的值。

我的解决方案是在解析要显示的值时避免完全使用WebGrid的ColumnName属性。我只是输入一个我知道存在于ColumnName的网格模型的值,在我的例子中是“Id”。这只是使用,因此WebGrid将呈现。然后,由于WebGridColumn的Format使用动态函数,我可以使用我想要的任何内容定义我的列值:

columns.Add(new WebGridColumn
{
    ColumnName = "Id",
    Header = field.Label,
    Format = x => new HtmlString(x.Value.GetEntityFieldValue(field.Field))
});

我很快就意识到这会弄乱排序。 MVC WebGrid的黑盒排序只是在排序查询中使用ColumnName,所以我现在的每一列都有“?sort = Id”。如果你没有排序,那你就没事了。如果你是,你将必须实现我正在做的自定义排序解决方案。