我正在将现有应用程序从 Telerik MVC 扩展转换为更新的 KendoUI 产品。我正在使用网格控件。向网格添加新行时,如何指定列的默认值?
使用旧的 Telerik MVC 扩展,我做了以下事情:
.Editable(editing=>editing.Mode(GridEditMode.InCell).DefaultDataItem(Model.defaultItem))
我的模型的 defaultItem 是我添加行的默认值。那么我该如何用剑道做到这一点呢?
哟哟哟伙计
您需要通过 dataSource 模型配置为每个字段指定默认值
这是您可以使用的示例;)
@(Html.Kendo()
.Grid<TestModel>()
.Name("SomeOtherGridName")
.DataSource(ds => ds.Ajax().Read("test", "test").Model(
x => {
x.Field(c => c.Val1).DefaultValue(5);
x.Field(c => c.Val2).DefaultValue("cool!");
}
))
.Columns(columns =>
{
columns.Bound(c => c.Val1);
columns.Bound(c => c.Val2);
})
)
DefaultDataItem当前不存在于 MVC 扩展中。但是,如果不使用 MVC 扩展作为解决方法,它仍然是可能的。
我写了一个扩展方法来完成DefaultDataItem()
. 它读取默认项的每个属性并在数据源模型定义中设置Field()
and :DefaultValue()
public static class DataSourceModelDescriptorFactoryExtensions
{
public static DataSourceModelDescriptorFactory<TModel> DefaultDataItem<TModel>(
this DataSourceModelDescriptorFactory<TModel> dataSourceModelBuilder,
TModel defaultDataItem) where TModel : class
{
var propertyInfos = typeof(TModel).GetProperties();
foreach (var propertyInfo in propertyInfos)
{
dataSourceModelBuilder
.Field(propertyInfo.Name, propertyInfo.PropertyType)
.DefaultValue(propertyInfo.GetValue(defaultDataItem));
}
return dataSourceModelBuilder;
}
}
像这样使用它:
@(Html.Kendo().Grid<MyEntity>()
...
.DataSource(ds => ds
...
.Model(model =>
{
model.Id(n => n.Id);
model.DefaultDataItem(myDefaultEntity);
}
)
)