动态列——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:

 

posted @ 2022-08-31 11:28  H辉  阅读(363)  评论(0编辑  收藏  举报