Telerik MVC网格与ExpandoObject列表

4

我正在尝试使用Telerik MVC与动态ExpandoObjects集合。

控制器代码如下:

[GridAction]
public ActionResult TestDiario()
{
        var result = new List<dynamic>();

        dynamic diarioModel = new ExpandoObject();

        var dictionary = (IDictionary<string, object>)diarioModel;

        dictionary.Add("ID", 1);
        dictionary.Add("AlunoID", 12781);
        dictionary.Add("DAY05CLASS1", true);
        dictionary.Add("DAY05CLASS2", true);
        dictionary.Add("DAY07CLASS1", true);
        dictionary.Add("DAY08CLASS1", true);

        result.Add(diarioModel);
        return View(result);
}

视图是:

@using Telerik.Web.Mvc.UI

@model IEnumerable<dynamic>

@{
    ViewBag.Title = "TestDiario";
}

@(Html.Telerik().Grid(Model).Name("Grid")
    .DataKeys(dataKeys => dataKeys.Add("ID"))
    .Columns(columns => 
    { 
        columns.Bound("MatAnoID").Visible(true);
        columns.Bound("AlunoID");
        columns.Bound("NroClasse");
        columns.Bound("Aluno");

        var dictionary = (IDictionary<string, object>)Model;
        foreach (var property in (IDictionary<String, Object>)dictionary)
        {
            if (property.Key.ToString().Remove(3) == "DAY")
            {
                columns.Bound(property.Key);
            }
        }
    })
    .Pageable()
    .Sortable()
    .Groupable()
    .Filterable()

)

foreach循环获取以DAY字符串开头的动态字段。

当我运行项目时,出现以下错误:

{"无法将一个类型化对象'System.Collections.Generic.List1[System.Object]'转换为类型'System.Collections.Generic.IDictionary2[System.String,System.Object]'。"}

是否有一种方法可以在使用Telerik MVC控件时使用动态对象来循环遍历字段?

1个回答

3
是的,您可以这样做,并且您已经很接近了,但是犯了几个错误。
1)Model不是IDictionary类型,因为它不是expando对象。它是动态列表。
这有点像黑客技巧,但为了解决这个问题,我只取了可枚举的第一个(或默认的)元素,然后从中创建了一个字典。
2)您正在尝试绑定作为expando对象中不存在属性的列。
我将它们注释掉了。
3)我认为您正在寻找以“DAY”开头的键。如果您想删除列名中的“DAY”,可以微调我的示例代码。
除此之外,它运行得很好:
@(Html.Telerik().Grid(Model).Name("Grid")
    .DataKeys(dataKeys => dataKeys.Add("ID"))
    .Columns(columns => 
    { 
        //NOTE: some of these columns are not valid because you didn't include them as properties
        //columns.Bound("MatAnoID").Visible(true);
        //columns.Bound("NroClasse");
        //columns.Bound("Aluno");

        columns.Bound("AlunoID");

        var first = Model.FirstOrDefault();
        if (first != null) {
            var dictionary = (IDictionary<string, object>)first;
            foreach (var property in dictionary) {
                string key = property.Key.ToString();
                if (key.StartsWith("day", StringComparison.InvariantCultureIgnoreCase)) {
                    columns.Bound(property.Key);
                }
            }
        }

    })
    .Pageable()
    .Sortable()
    .Groupable()
    .Filterable()
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接