2013-03-13 5 views
7

ich die folgende Fehlermeldung erhalten, wenn eine Datentabelle auf einen Telerik Kendo Grid zu binden versuchen:Kendo ASP.NET MVC - Index Out of Range Databinding

Index außerhalb des zulässigen Bereichs war. Muss nicht negativ und kleiner als die Größe der Sammlung sein.

Ich habe Telerik Beispielprojekt verfolgt, aber in meinem Code scheint es auf der 'Lesen' Funktion 'Datasource' werden Fehler:

.Read (lesen => read.Action ("Read "," Ereignisse "))

Ich habe ActionResult Read() gibt gerade null zurück, nur weil ich sehen wollte, ob es überhaupt zu dieser Funktion kommen würde. Außerdem bin ich durchgetreten und die Datentabelle gibt die korrekten Spalten- und Spaltennamen zurück.

Jede Hilfe wird geschätzt.

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 ::

Hier ist der Stack-Trace, ich bin nicht sicher, ob das wird helfen.

 
    [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 
+0

Wenn Sie eine leere Ergebnismenge zurückgeben, funktioniert es ??? –

+0

@BrianMains - Ich habe es so eingestellt, dass es eine leere Datentabelle zurückgibt, aber den gleichen Fehler hat. – fortune

Antwort

10

Es stellte sich heraus, dass es zu meiner web.config verwandt wurde. Ich habe mit jedem Kendo-Objekt, das ich erstellt habe, auf Fehler gestoßen. Das Hinzufügen des folgenden Codes zur obersten Ebene web.config schien alles zu beheben.

<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> 
+1

Eine der möglichen Ursachen für den Fehler ist, dass eine ältere Version von System.Web.Mvc als 4.0 geladen werden kann, wenn es sich bei Ihrem Projekt um ein "Legacy" -Projekt handelt, dem Sie Kendo UI hinzugefügt haben. Wenn die Daten vom Server zurückgegeben werden, ist das Format nicht erkennbar und verursacht den Fehler. Wenn Sie dies in der Web.config auf oberster Ebene hinzufügen, erzwingen Sie, dass die neueste Version mit Ihrer Site geladen wird. – RCGoforth

+0

Sie haben mir so viel Zeit erspart, danke. – Menahem

0

Ich würde vermuten, dass der Fehler auftritt, weil die Read Aktion keine gültige Ergebnismenge zurück.

Normalerweise benötigt das Kendo-Gitter eine JsonResult, die beim Lesen im Ajax-Modus zurückgegeben wird. Wenn Sie ein leeres DataTable korrekt als ein JSON-Ergebnis formatiert zurückgeben, vermute ich, dass es beheben würde.

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

Offensichtlich sollten Sie die DataTable für Ihre reale Ergebnismenge ersetzen.

+0

Ich habe diese Änderung vorgenommen, aber ich erhalte immer noch den Fehler. Ich habe einen Haltepunkt auf dem Eingang zu dieser Funktion, aber es erreicht nicht einmal das. Könnte dieser Fehler auftreten, wenn Sie die Aktion oder den Controller nicht finden können? – fortune

+0

Können Sie die Ajax-Anfrage im Browser überwachen und sehen, welchen Antwortcode Sie erhalten? Der http-Statuscode würde Ihnen sagen, ob die Route nicht gefunden wird oder ob ein Autorisierungsproblem oder ein Serverfehler vorliegt. – nukefusion

+0

Ich werde mir das jetzt ansehen. Außerdem habe ich meinen Beitrag mit dem Stack-Trace aktualisiert, ich bin mir nicht sicher, ob das hilfreich sein wird. – fortune

4

Durch den Abschnitt in der Datei web.config Ihrer Lösung wird Ihnen helfen.

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