【问题标题】:Kendo UI Html Grid 'an item with the same key has already been added'Kendo UI Html Grid'已添加具有相同键的项目'
【发布时间】:2018-03-29 19:23:28
【问题描述】:

使用 Telerik 的 Kendo UI,Kendo.Mvc 版本 2016.3.1028.545

我有一个包含 html 网格的视图,如下所示:

            @(Html.Kendo().Grid<TfUserLoginHistoryReturnModel>()
                .Name("loginHistoryGrid")
                .DataSource(dataSource => dataSource
                    .Ajax()
                    .Read(read => read.Action("LoginHistory_Read", "Administration", new { DateStart = Model.StartDate }))
                    .Model(model => model.Id(p => p.UserID)
                    )
                )
                .Events(events => events.DataBound("onGridDataBound"))
                .Columns(columns =>
                {
                    columns.Bound(p => p.FullName).Title("Full Name");
                    columns.Bound(p => p.Email);
                    columns.Bound(p => p.CompanyName).Title("Company");
                    columns.Bound(p => p.UserType).Title("User Type");
                    columns.Bound(p => p.AcceptedTermsDate).Title("Date Accepted Terms").Format("{0:MM/dd/yyyy}").Width(125);
                    columns.Bound(p => p.LastSuccessfulLogin).Title("Last Login").Format("{0:MM/dd/yyyy}").Width(125);
                    columns.Bound(p => p.NumLogins).Title("Number of Logins");
                    columns.Bound(p => p.TotalTime).Title("Time Logged (minutes)");
                })
                .Pageable()
                .Sortable()
                .Scrollable()
                .Filterable(f => f.Extra(true)
                    .Operators(o => o.ForString(s => s.Clear()
                    .Contains("Contains")
                    .DoesNotContain("Does not contain")
                    .IsEqualTo("Is equal to")
                    .IsNotEqualTo("Is not equal to")
                    .StartsWith("Starts with")
                    .EndsWith("Ends with")
                    .IsEmpty("Is empty")
                    .IsNotEmpty("Is not empty")
                    .IsNull("Is null")
                    .IsNotNull("Is not null "))))
                .HtmlAttributes(new { style = "height:500px;" })
            )

相关脚本:

    function onGridDataBound(e) {
        var grid = e.sender;
        if (grid.dataSource.total() == 0) {
            $(grid).hide();
        }
        else {
            $(grid).show();
        }
    }

    function searchUserGrid(e) {
        if ($("#userSearchText").val() == "") {
            $("#loginHistoryGrid").data("kendoGrid").dataSource.filter({ field: "UserId", operator: "equals", value: -1 });
        } else {
            $filter = [{
                "logic": "or",
                "filters": [
                        { field: "FullName", operator: "contains", value: $("#userSearchText").val() },
                        { field: "Email", operator: "contains", value: $("#userSearchText").val() },
                        { field: "CompanyName", operator: "contains", value: $("#userSearchText").val() }
                ]
            }];
            $("#loginHistoryGrid").data("kendoGrid").dataSource.filter($filter);
        }
    }

这是控制器中该视图的 Get:

    [HttpGet]
    public ActionResult UsageReport(string DateStart)
    {
        try
        {
            UserLoginHistoryViewModel m = new UserLoginHistoryViewModel();

            //default is yesterday
            DateTime sdt = DateTime.Now.Date.AddDays(-1);
            if (!string.IsNullOrWhiteSpace(DateStart))
            {
                DateTime.TryParse(DateStart, out sdt);
            }
            m.StartDate = sdt;

            return View(m);
        }
        catch (Exception ex)
        {
            logger.Error("UsageReportGet", ex);
            return RedirectToAction("Index", "Administration");
        }
    }

当我使用断点运行它并转到该页面时,它甚至没有在控制器中点击LoginHistory_Read。在击中网格时,它会出错。这是错误和堆栈跟踪:

System.ArgumentException 未被用户代码处理
HResult=-2147024809 Message=具有相同键的项目已经 被添加。来源=mscorlib 堆栈跟踪: 在 System.ThrowHelper.ThrowArgumentException(ExceptionResource 资源) at System.Collections.Generic.Dictionary'2.Insert(TKey key, TValue value, Boolean add) 在 System.Web.Routing.RouteValueDictionary.Add(字符串键,对象值) 在 Kendo.Mvc.UI.GridBoundColumn'2.CreateHeaderBuilderCore() 在 Kendo.Mvc.UI.GridColumnBase'1.CreateHeaderBuilder() 在 Kendo.Mvc.UI.Html.GridCellBuilderFactory.CreateHeaderCellBuilder(IGridColumn 柱子) 在 System.Linq.Enumerable.WhereSelectEnumerableIterator'2.MoveNext() 在 Kendo.Mvc.UI.Html.GridRowBuilder.CreateRow() 在 Kendo.Mvc.UI.Html.GridHeaderRowBuilder.CreateRow() 在 Kendo.Mvc.UI.Html.GridRowBuilderDecoratorBase.CreateRow() 在 Kendo.Mvc.UI.Html.GridRowBuilderDecoratorBase.CreateRow() 在 Kendo.Mvc.UI.Html.GridRowBuilderDecoratorBase.CreateRow() 在 Kendo.Mvc.UI.Html.GridRowBuilderDecoratorBase.CreateRow() 在 Kendo.Mvc.UI.Html.GridRowBuilderDecoratorBase.CreateRow() 在 Kendo.Mvc.UI.Html.GridRowBuilderDecoratorBase.CreateRow() 在 Kendo.Mvc.UI.Html.GridRowBuilderDecoratorBase.CreateRow() 在 Kendo.Mvc.UI.Html.GridDataSectionBuilder.CreateHeader(GridRenderingData 数据) 在 Kendo.Mvc.UI.Html.GridScrollingHtmlBuilder.CreateHeader(GridRenderingData 渲染数据) 在 Kendo.Mvc.UI.Html.GridScrollingHtmlBuilder.AppendData(IHtmlNode div, GridRenderingData 渲染数据) 在 Kendo.Mvc.UI.Html.GridHtmlBuilder.CreateGrid(IDictionary'2 htmlAttributes, GridFunctionalData functionalData, GridRenderingData 渲染数据) 在 Kendo.Mvc.UI.Grid'1.WriteHtml(HtmlTextWriter writer) 在 Kendo.Mvc.UI.WidgetBase.ToHtmlString() 在 Kendo.Mvc.UI.Fluent.WidgetBuilderBase'2.ToHtmlString() 在 System.Web.HttpUtility.HtmlEncode(对象值) 在 System.Web.WebPages.WebPageBase.Write(对象值) 在 ASP._Page_Views_Administration_UsageReport_cshtml.Execute() 中 C:\Users\tsimpson\Source\Workspaces\CustomerPortal\CEConnect\CEConnect\Views\Administration\UsageReport.cshtml:line 42 在 System.Web.WebPages.WebPageBase.ExecutePageHierarchy() 在 System.Web.Mvc.WebViewPage.ExecutePageHierarchy() 在 System.Web.WebPages.StartPage.RunPage() 在 System.Web.WebPages.StartPage.ExecutePageHierarchy() 在 System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage) 在 System.Web.Mvc.RazorView.RenderView(ViewContext viewContext,TextWriter writer,Object 实例) 在 System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext,TextWriter writer) 在 System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext 上下文) 在 System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext 控制器上下文,动作结果动作结果) 在 System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList'1 过滤器,Int32 filterIndex,ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult) 在 System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList'1 过滤器,Int32 filterIndex,ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult)
内部异常:

所以如果我在没有断点的情况下运行它,页面会加载,但网格是空的。

当时我不知道如何知道它试图添加到字典中的内容。我将此与我网站中其他有效的网格进行了比较,但看不出是什么导致了这个问题。

这是我制作的一段视频,展示了走过它的样子,因此您可以准确地看到错误出现的时间 - 希望对您有所帮助。请务必将其设置为 1080p! Kendo Grid Error

让我知道需要哪些其他信息来尝试确定它可能是什么。谢谢!

【问题讨论】:

  • 第一次加载正常吗?
  • @AkashKC - 不。如果我在没有断点的情况下运行它,页面将加载,但由于在点击读取功能之前出现网格错误,因此其中没有任何内容。
  • 你能分享一下你的控制器实现吗?
  • @AkashKC - 我为它添加了 Get。
  • 尝试将您的操作更改为public ActionResult UsageReport([DataSourceRequest] DataSourceRequest request,string DateStart)

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


【解决方案1】:

因此,尽管我承认我并不完全理解为什么这不起作用,但我通过重新设计网格获取数据的方式来解决它。我没有设置网格的 DataSource 属性并使用 Read 函数,而是指定网格的模型,如下所示: @(Html.Kendo().Grid(Model.LoginHistories) 我添加了“LoginHistories”作为我的视图正在使用的模型的属性。所以在 Get 函数中,我只是设置了类似于 Read 函数所做的属性。

【讨论】:

    【解决方案2】:

    就我而言,我的 MODEL 有 2 个名称相似的属性:

    public int? corporateId { get; set; }
    public int? CorporateId { get; set; }
    

    一个是 CamelCase,另一个不是。

    解决方案是简单地删除一个或更改其中一个的名称:

    //public int? corporateId { get; set; }
    public int? corporate_id { get; set; }
    public int? CorporateId { get; set; }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-15
      • 2013-04-04
      • 2013-02-16
      • 2022-09-29
      • 2011-06-18
      相关资源
      最近更新 更多