我在我的应用程序中使用MVC的WebGrid,它一直很好用。我在控制器代码中设置网格的列,然后将其传递给我的视图。我添加了一个新列,其中columns
是List<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开箱即用,或者我是否必须扩展功能。提前谢谢。
答案 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”。如果你没有排序,那你就没事了。如果你是,你将必须实现我正在做的自定义排序解决方案。