动态列——DataGrid系列
当model里面的字段属性不确定时,就需要用到动态列。
先上效果图:
以下为关键代码
前端:
@{
var columnData = new[] { "test1:测试1","test2:测试2","test3:测试3"};
}
.DataSource(d => d.Mvc().Controller("EHour")
.LoadAction("GetProjectPage")
…………
.Columns(c =>
{
foreach(var item in columnData)
{
c.Add().DataField(item.Split(":")[0]).Caption(item.Split(":")[1]);
}
})
------------------------------------------------------------------------------------------------------------
后端:
[HttpGet]
public async Task<object> GetProjectPage(DataSourceLoadOptions loadOptions)
{
var data = new List<ProjectManageViewModel>() {
new ProjectManageViewModel(){
Status = 0,
ID = 1,
ProjectName = "工程1",
GroupName = "组别1"
}
};
var result = new List<object>();
foreach (var item in data)
{
var obj= ConvertToExpando(item);
AddProperty(obj, "test1", "111");
AddProperty(obj, "test2", "222");
AddProperty(obj, "test3", "333");
result.Add(obj);
}
return DataSourceLoader.Load(result, loadOptions);
}
public static ExpandoObject ConvertToExpando(object obj)
{
var flags = BindingFlags.Public | BindingFlags.Instance;
var properties = obj.GetType().GetProperties(flags);
var expando = new ExpandoObject();
foreach (var property in properties)
{
AddProperty(expando, property.Name, property.GetValue(obj));
}
return expando;
}
public static void AddProperty(ExpandoObject expando, string propertyName, object propertyValue)
{
var expandoDict = expando as IDictionary<string, object>;
if (expandoDict.ContainsKey(propertyName))
expandoDict[propertyName] = propertyValue;
else
expandoDict.Add(propertyName, propertyValue);
}
该接口返回的数据:
model: