Index Out of Range Databinding
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:UserswsharpDocumentsVisual Studio 2010ProjectsInvisoInvisoViewsEventsEvents.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:UserswsharpDocumentsVisual Studio 2010ProjectsInvisoInvisoViewsEventsEvents.cshtml:30
Kendo.Mvc.UI.Fluent.GridBuilder`1.DataSource(Action`1 configurator) +212
ASP._Page_Views_Events_Events_cshtml.Execute() in c:UserswsharpDocumentsVisual Studio 2010ProjectsInvisoInvisoViewsEventsEvents.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
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>
通过在解决方案的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>
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.
上一篇: DotNetOpenAuth ...在服务器上断开CreatRequest(在我的机器上工作;
下一篇: 索引超出范围数据绑定
