7
votes

I'm getting the following error when trying to bind a datatable to a Telerik Kendo Grid:

Index was out of range. Must be non-negative and less than the size of the collection.

I've followed Telerik's example project, but in my code it seems to be failing on the 'Read' function of 'DataSource':

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

I have ActionResult Read() is currently returning null, just because I wanted to see if it'd even make it to that function. Also, I've stepped through and the datatable is returning the correct columns and column names.

Any help is appreciated.

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

UPDATE::

Here is the stack trace, I'm not sure if that will help.

    [ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than    the size of the collection.
    Parameter name: index]
     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
   ASP._Page_Views_Events_Events_cshtml.b__3(CrudOperationBuilder read) in c:\Users\wsharp\Documents\Visual Studio 2010\Projects\Inviso\Inviso\Views\Events\Events.cshtml:40
   Kendo.Mvc.UI.Fluent.AjaxDataSourceBuilderBase`2.Read(Action`1 configurator) +131
   ASP._Page_Views_Events_Events_cshtml.b__2(DataSourceBuilder`1 dataSource) in c:\Users\wsharp\Documents\Visual Studio 2010\Projects\Inviso\Inviso\Views\Events\Events.cshtml:30
   Kendo.Mvc.UI.Fluent.GridBuilder`1.DataSource(Action`1 configurator) +212
   ASP._Page_Views_Events_Events_cshtml.Execute() in c:\Users\wsharp\Documents\Visual Studio 2010\Projects\Inviso\Inviso\Views\Events\Events.cshtml:16
   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 context) +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 filter, ResultExecutingContext preContext, Func`1 continuation) +242
   System.Web.Mvc.c__DisplayClass1c.b__19() +21
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, 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 result) +9
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +9629296
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155
3
If you return an empty result set, does it work???Brian Mains
@BrianMains - I set it to return an empty data table, but got the same error.fortune

3 Answers

10
votes

Turns out it was related to my web.config. I was running into errors with every Kendo object I created. Adding the following code to the top level web.config seemed to fix everything.

<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>
4
votes

By including section in your solution's web.config file will help you.

<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>
0
votes

I would speculate that the error is occurring because the Read action is not returning a valid result set.

Usually the Kendo grid requires a JsonResult to be returned when reading in Ajax mode. If you return an empty DataTable correctly formatted as a json result then I suspect that would fix it.

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

Obviously you should substitute the DataTable for your real result set.