【问题标题】:Kendo UI Grid ASP.Net MVC populating from DataTable - Avoid fetching data twice从 DataTable 填充的 Kendo UI Grid ASP.Net MVC - 避免两次获取数据
【发布时间】:2017-05-12 09:07:47
【问题描述】:

我正在关注示例here,在我看来,我们用模型调用视图(填充的数据表)似乎效率低

 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"))

在 HomeController 中:

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

有没有更好、更有效的方法在创建时从 DataSet 分配网格数据?

【问题讨论】:

  • 如果您指定读取命令,则不要获取视图的负载,或使用视图结果中的数据来绑定网格。
  • 还有另一种方式绑定Kendo Grid through JQuery
  • Vinay - 我不太明白 - 你是说没有模型实例的所有视图吗?我试过了,但是模型当然是空的,所以我当然会得到一个 NullReferenceException (并且网格无法获取列名!)或者你的意思可能与 mmushtaq 相同并通过 JQuery 来完成?
  • mmushtaq - 我知道这一点,但我特别想避免必须专门设置特定列等 - 我想要一个动态的、通用的解决方案来在 Kendo Grid 中显示 DataTable。 Html 助手版本似乎提供了。

标签: c# asp.net-mvc kendo-ui kendo-grid


【解决方案1】:

最后,我用属性装饰了 Model 类,并使用了这些。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多