Kendo ASP.NET MVC - 索引超出范围数据绑定

Posted

技术标签:

【中文标题】Kendo ASP.NET MVC - 索引超出范围数据绑定【英文标题】:Kendo ASP.NET MVC - Index Out of Range Databinding 【发布时间】:2013-03-01 10:49:06 【问题描述】:

尝试将数据表绑定到 Telerik Kendo Grid 时出现以下错误:

索引超出范围。必须是非负数且小于集合的大小。

我已经关注 Telerik 的示例项目,但在我的代码中,“DataSource”的“读取”功能似乎失败了:

.Read(read => read.Action("Read", "Events"))

我有 ActionResult Read() 当前返回 null,只是因为我想看看它是否能实现该功能。此外,我已经逐步完成,数据表正在返回正确的列和列名。

感谢任何帮助。

Events.cshtml

@model System.Data.DataTable

@
    ViewBag.Title = "Events";
    Layout = "~/Views/_mainLayout.cshtml";


<p>Events</p>

@(Html.Kendo().Grid(Model)
    .Name("GridStatic")
    .Columns(columns =>
    
        columns.Bound("ID");
        columns.Bound("EntryType");
        columns.Bound("EventDate");
        columns.Bound("EventData");
        columns.Bound("Source");
    )
    .Pageable()
    .Sortable()
    .Scrollable()
    .Filterable()
    .DataSource(dataSource => dataSource
        .Ajax()       
        .Model(model =>
            
                model.Field("ID", typeof(int));
                model.Field("EntryType", typeof(DateTime));
                model.Field("EventDate", typeof(string));
                model.Field("EventData", typeof(string));
                model.Field("Source", typeof(string));
            )
        .Read(read => read.Action("Read", "Events"))
    )
)

EventsController.cs

public class EventsController : Controller

    //
    // GET: /Events/

    public ActionResult Events(string sName)
    
        EventReader ereader = new EventReader(sName);
        return View(ereader.ParseIntoTable(ereader.GetListOfEvents()));
    

    public ActionResult Read([DataSourceRequest] DataSourceRequest request)
    
        return null;
    

更新::

这是堆栈跟踪,我不确定这是否有帮助。

[ArgumentOutOfRangeException:索引超出范围。必须是非负数且小于集合的大小。 参数名称:索引] System.ThrowHelper.ThrowArgumentOutOfRangeException() +72 System.Collections.ObjectModel.Collection`1.set_Item(Int32 index, T value) +10451574 System.Web.Mvc.ControllerContext.get_RequestContext() +25 Kendo.Mvc.UI.NavigatableExtensions.GenerateUrl(INavigatable navigatable, ViewContext viewContext, IUrlGenerator urlGenerator) +52 Kendo.Mvc.UI.Fluent.CrudOperationBuilder.SetUrl() +81 Kendo.Mvc.UI.Fluent.CrudOperationBuilder.Action(String actionName, String controllerName, Object routeValues) +66 Kendo.Mvc.UI.Fluent.CrudOperationBuilder.Action(String actionName, String controllerName) +47 c:\Users\wsharp\Documents\Visual Studio 2010\Projects\Inviso\Inviso\Views\Events\Events.cshtml:40 中的 ASP._Page_Views_Events_Events_cshtml.b__3(CrudOperationBuilder 读取) Kendo.Mvc.UI.Fluent.AjaxDataSourceBuilderBase`2.Read(Action`1 配置器) +131 c:\Users\wsharp\Documents\Visual Studio 2010\Projects\Inviso\Inviso\Views\Events\Events.cshtml:30 中的 ASP._Page_Views_Events_Events_cshtml.b__2(DataSourceBuilder`1 数据源) Kendo.Mvc.UI.Fluent.GridBuilder`1.DataSource(Action`1 配置器) +212 c:\Users\wsharp\Documents\Visual Studio 2010\Projects\Inviso\Inviso\Views\Events\Events.cshtml:16 中的 ASP._Page_Views_Events_Events_cshtml.Execute() System.Web.WebPages.WebPageBase.ExecutePageHierarchy() +197 System.Web.Mvc.WebViewPage.ExecutePageHierarchy() +97 System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage) +76 System.Web.Mvc.RazorView.RenderView(ViewContext viewContext, TextWriter writer, Object instance) +260 System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer) +115 System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext 上下文)+295 System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult) +13 System.Web.Mvc.c__DisplayClass1a.b__17() +23 System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter 过滤器,ResultExecutingContext preContext,Func`1 延续)+242 System.Web.Mvc.c__DisplayClass1c.b__19() +21 System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 过滤器, ActionResult actionResult) +177 System.Web.Mvc.Async.c__DisplayClass2a.b__20() +89 System.Web.Mvc.Async.c__DisplayClass25.b__22(IAsyncResult asyncResult) +102 System.Web.Mvc.Async.WrappedAsyncResult`1.End() +57 System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +43 System.Web.Mvc.c__DisplayClass1d.b__18(IAsyncResult asyncResult) +14 System.Web.Mvc.Async.c__DisplayClass4.b__3(IAsyncResult ar) +23 System.Web.Mvc.Async.WrappedAsyncResult`1.End() +62 System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +57 System.Web.Mvc.Async.c__DisplayClass4.b__3(IAsyncResult ar) +23 System.Web.Mvc.Async.WrappedAsyncResult`1.End() +62 System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +47 System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +10 System.Web.Mvc.c__DisplayClass8.b__3(IAsyncResult asyncResult) +25 System.Web.Mvc.Async.c__DisplayClass4.b__3(IAsyncResult ar) +23 System.Web.Mvc.Async.WrappedAsyncResult`1.End() +62 System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +47 System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult 结果) +9 System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +9629296 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155

【问题讨论】:

如果返回一个空的结果集,是否有效??? @BrianMains - 我将它设置为返回一个空数据表,但得到了同样的错误。 【参考方案1】:

原来它与我的 web.config 有关。我创建的每个剑道对象都遇到了错误。将以下代码添加到*** web.config 似乎可以解决所有问题。

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
      <bindingRedirect oldVersion="1.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
    </dependentAssembly>
  </assemblyBinding>
</runtime>

【讨论】:

错误的一个可能原因是如果您的项目是您添加了 Kendo UI 的“旧”项目,则可以加载早于 4.0 版本的 System.Web.Mvc。当数据从服务器返回时,格式无法识别并导致错误。通过在*** web.config 中添加它,您可以强制最新版本与您的网站一起加载。【参考方案2】:

通过在您的解决方案的 web.config 文件中包含部分将帮助您。

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
        </dependentAssembly>
        <dependentAssembly>
            <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="1.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
        </dependentAssembly>
        <dependentAssembly>
            <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
        </dependentAssembly>
    </assemblyBinding>
</runtime>

【讨论】:

【参考方案3】:

我推测发生错误是因为Read 操作未返回有效的结果集。

通常,在 Ajax 模式下读取时,Kendo 网格需要返回 JsonResult。如果你返回一个空的 DataTable 正确格式化为 json 结果,那么我怀疑这会解决它。

  public ActionResult Read([DataSourceRequest] DataSourceRequest request)
  
     return this.Json(new DataTable().ToDataSourceResult(request));
  

显然,您应该将DataTable 替换为您的真实结果集。

【讨论】:

我进行了更改,但仍然收到错误消息。我在该函数的入口上有一个断点,但它甚至没有达到那个。这个错误会不会是由于找不到动作或控制器造成的? 你能在浏览器中监控ajax请求,看看你得到了什么响应码吗? http 状态码会告诉您是否找不到路由,或者是否存在授权问题或服务器错误。 我现在就看看。另外,我已经用堆栈跟踪更新了我的帖子,我不确定这是否会有所帮助。 HTTP 正在返回状态 500。 好的,这表明错误发生在初始页面加载时,Ajax 请求甚至没有机会触发。堆栈跟踪似乎指向构建数据源的读取 URL 的问题,但目前不太确定确切的问题是什么。我复制了你的示例,只是使用了一条不存在的路线,它适用于我使用最新的 Kendo 版本。

以上是关于Kendo ASP.NET MVC - 索引超出范围数据绑定的主要内容,如果未能解决你的问题,请参考以下文章

使用 Kendo UI Asp.net mvc core 未显示图表组件

ASP.NET MVC - Kendo Grid 慢分页

ASP.NET MVC 中的 Kendo 树图工具提示

Kendo UI Web 和 Kendo UI ASP.NET for MVC 之间的区别

asp.net mvc kendo ui grid 加密列数据

在 ASP.NET MVC 上使用 Kendo Grid 更改数据