我的一些模型具有自定义(用户管理)属性。由于它们是动态的,我不能将它们作为我的模型中的属性包含在内。所以我尝试使用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
)来实现这一目标吗?
答案 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)