使用自定义属性扩展Kendo Grid模型

时间:2014-05-20 20:54:28

标签: .net dynamic kendo-ui kendo-grid kendo-asp.net-mvc

我的一些模型具有自定义(用户管理)属性。由于它们是动态的,我不能将它们作为我的模型中的属性包含在内。所以我尝试使用DynamicObject

提供这些功能
public class MyModel : DynamicObject
{
    public Dictionary<String, Object> CustomFields { get; set; }

    ...

    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        if (binder.Name.StartWith("CustomField_"))
        {
            // get the custom field
        }
        return base.TryGetMember(binder, out result);
    }
}

现在使用Kendo.Mvc.UI.Fluent.GridBuilder我正在建立我的自定义属性:

@(Html.Kendo().Grid<object>()
    .Columns(columns =>
    {
        ...
        foreach (var fieldDef in CustomFieldDefinitions)
        {
            var columnBuilder = columns.Bound("CustomField_" + fieldDef.Name);
            columnBuilder.Title(fieldDef.Name);
        }
    })
    ...

额外的列显示在网格中,但永远不会调用TryGetMember

我也尝试过实施GetDynamicMemberNames。没有区别。

有什么方法可以使用IDynamicMetaObjectProvider实现(DynamicObject)来实现这一目标吗?

1 个答案:

答案 0 :(得分:1)

好的,我弄清楚出了什么问题。我正在使用ajax绑定,在我的控制器中我基本上做了以下事情:

[HttpPost]
public ActionResult GetRows([DataSourceRequest]DataSourceRequest request)
{
    return Json(GetRows<MyModel>().ToDataSourceResult(request, o => o));
}

这意味着它正在序列化我的模型,这导致了一个不包含我的动态成员的对象列表。

我通过将所有对象成员(包括动态)映射到字典来修复它:

[HttpPost]
public ActionResult GetRows([DataSourceRequest]DataSourceRequest r)
{
    return Json(GetRows<MyModel>().ToDataSourceResult(r, ObjectToDictionary));
}

private Dictionary<String, Object> ObjectToDictionary(Object obj)
{
    return Dynamic.GetMemberNames(obj)
        .ToDictionary(name => name, name => Dynamic.InvokeGet(obj, name));
}

Dyanmic来自类库https://github.com/ekonbenefits/dynamitey