剑道 UI 网格 ASP.Net 从数据表填充的 MVC - 避免两次获取数据



我在这里遵循示例,我们用模型(填充的数据表(调用视图对我来说似乎效率低下

 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;
        }
    }

最新更新