我在这里遵循示例,我们用模型(填充的数据表(调用视图对我来说似乎效率低下
public ActionResult Index()
{
DataTable products = Products();
return View(products);
}
但它仅用于获取列标题,我们必须在"读取"操作中再次调用它以实际填充网格 - 即使创建网格时所有数据都已经可用。
@model System.Data.DataTable
@(
Html.Kendo().Grid<dynamic>()
.Name("Grid")
.Columns(columns =>
{
foreach (System.Data.DataColumn column in Model.Columns)
{
var c = columns.Bound(column.ColumnName);
}
columns.Command(cmd => cmd.Edit());
})
...
.Read(read => read.Action("Read", "Home"))
在主控制器中:
public ActionResult Read([DataSourceRequest] DataSourceRequest request)
{
DataTable products = Products();
if (request.Aggregates.Any())
{
request.Aggregates.Each(agg =>
{
agg.Aggregates.Each(a =>
{
a.MemberType = products.Columns[agg.Member].DataType;
});
});
}
return Json(products.ToDataSourceResult(request));
}
有没有更好、更有效的方法在创建时从数据集分配网格数据?
最后,我用属性装饰模型类,并使用了这些属性。
public static void AutoColumnsFromProperties<T>(GridColumnFactory<T> columns, bool multiFilterable = true) where T: class
{
//Hidden:
//
//<ScaffoldColumn(False)>
//Public Property RowNum As Integer
//Order and width:
//
//<Display(Order:=0, Name:="Mat Nr")>
//<GridColumn(Width:=80)>
//Public Property Material_Nr As String
foreach (var propertyInfo in ObjectPropertyHelper.GetVisibleProperties(typeof(T), true).OrderBy((x) => Annotations.GetOrderNumber(x, 0)))
{
var width = Annotations.GetGridColumnWidth(propertyInfo, null);
columns.Bound(propertyInfo.Name).Width(width).Filterable((ftb) => ftb.Multi(multiFilterable));
}
}
并按如下方式调用代码:
@(Html.Kendo().Grid<Models.Thingy>()
.Name("thingy")
.Columns((x) => KendoGridUtilities.AutoColumnsFromProperties(x))
图书馆代码:
public class ObjectPropertyHelper
{
//Public Shared Iterator Function GetVisibleProperties(Of T)(Optional isVisible As Boolean = True) As IEnumerable(Of PropertyInfo)
// GetVisibleProperties(GetType(T), isVisible)
//End Function
public static IEnumerable<PropertyInfo> GetVisibleProperties(Type type, bool isVisible)
{
var props = type.GetProperties();
for (var i = 0; i < props.Length; i++)
{
PropertyInfo propertyInfo = props[i];
if (propertyInfo.CanRead)
{
bool shouldScaffold = Annotations.ShouldScaffoldColumn(propertyInfo);
var x = props[i].Name;
if (shouldScaffold == isVisible)
{
yield return propertyInfo;
}
}
}
}
}
"注释"有点野兽,所以我不会在这里发布,相关部分是
public static bool ShouldScaffoldColumn(PropertyInfo propertyInfo)
{
return GetAttributeReturnValue<ScaffoldColumnAttribute, bool>(propertyInfo, (attr) => ((ScaffoldColumnAttribute)attr).Scaffold, true);
}
/// <summary>
/// Calculate a return value from an attribute. See ShouldScaffoldColumn for example usage
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="propertyInfo"></param>
/// <param name="eval">Function to use when evaluating the attribute's value to return a return value.</param>
/// <returns></returns>
private static T GetAttributeReturnValue<TAttr, T>(PropertyInfo propertyInfo, Func<object, T> eval, T valueWhenNotFound = null)
{
T returnValue = valueWhenNotFound;
var attrs = propertyInfo.GetCustomAttributes(typeof(TAttr), false);
if (!(attrs == null) && attrs.Length > 0)
{
var attr = attrs.First();
if (!(attr == null))
{
returnValue = eval(attr);
}
}
return returnValue;
}
}