Kendo ASP.NET MVC — индекс вне диапазона привязки данных

Я получаю следующую ошибку при попытке привязать таблицу данных к сетке Telerik Kendo Grid:

Индекс был вне допустимого диапазона. Должно быть неотрицательным и меньше размера коллекции.

Я следовал примеру проекта Telerik, но в моем коде, похоже, не работает функция «Чтение» «DataSource»:

.Read(read => read.Action("Чтение", "События"))

У меня есть 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"))
    )
)

Контроллер событий.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: 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

person fortune    schedule 13.03.2013    source источник
comment
Если вы вернете пустой набор результатов, это сработает???   -  person Brian Mains    schedule 13.03.2013
comment
@BrianMains - я настроил его на возврат пустой таблицы данных, но получил ту же ошибку.   -  person fortune    schedule 13.03.2013


Ответы (3)


Оказывается, это было связано с моим 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>
person fortune    schedule 14.03.2013
comment
Одна из возможных причин ошибки заключается в том, что версия System.Web.Mvc старше 4.0 может быть загружена, если ваш проект является «устаревшим» проектом, в который вы добавили пользовательский интерфейс Kendo. Когда данные возвращаются с сервера, формат не распознается и вызывает ошибку. Добавляя это в файл web.config верхнего уровня, вы заставляете новейшую версию загружаться вместе с вашим сайтом. - person RCGoforth; 13.06.2013

Включение раздела в файл 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>
person Prasanna    schedule 18.08.2013

Я бы предположил, что ошибка возникает из-за того, что действие Read не возвращает допустимый набор результатов.

Обычно сетка кендо требует возврата JsonResult при чтении в режиме Ajax. Если вы вернете пустой DataTable, правильно отформатированный как результат json, я подозреваю, что это исправит это.

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

Очевидно, вы должны заменить DataTable на ваш реальный набор результатов.

person Matt B    schedule 13.03.2013
comment
Я сделал это изменение, но я все еще получаю сообщение об ошибке. У меня есть точка останова на входе в эту функцию, но она даже не достигает этого. Может ли эта ошибка возникнуть из-за невозможности найти действие или контроллер? - person fortune; 13.03.2013
comment
Можете ли вы отслеживать запрос ajax в браузере и видеть, какой код ответа вы получаете? Код состояния http сообщит вам, не найден ли маршрут или есть ли проблема с авторизацией или ошибка сервера. - person Matt B; 13.03.2013
comment
Я посмотрю на это прямо сейчас. Кроме того, я обновил свой пост с трассировкой стека, я не уверен, что это будет полезно. - person fortune; 13.03.2013
comment
HTTP возвращает статус 500. - person fortune; 13.03.2013
comment
Хорошо, это показывает, что ошибка происходит при начальной загрузке страницы, запрос Ajax даже не получает шанса сработать. Трассировка стека, похоже, указывает на проблему с созданием URL-адреса для чтения источника данных, но не совсем уверен, в чем именно заключается проблема на данный момент. Я скопировал ваш пример и просто использовал несуществующий маршрут, и он работает для меня, используя последнюю версию Kendo. - person Matt B; 13.03.2013
comment
Я просто взял последнюю версию и попробовал еще раз. Все равно не повезло. Это должен быть либо мой компьютер, либо таблица данных. - person fortune; 13.03.2013
comment
Трассировка стека выглядит так, как будто указывает на проблему, разрешающую RequestContext. Я думаю, что здесь должен действовать какой-то другой фактор, не относящийся к сетке кендо или действиям вашего контроллера. Можете ли вы проверить значение RequestContext в своем представлении до того, как сетка будет построена с использованием @ViewContext.RequestContext? - person Matt B; 13.03.2013
comment
Это не ноль, есть ли что-то конкретное, что я должен искать в RequestContext? - person fortune; 13.03.2013
comment
Я переместил часть своего кода в проект Telerik, и теперь он создает Grid. Мне нужно отследить точный фрагмент кода, вызывающий проблему. Спасибо за вашу помощь. - person fortune; 14.03.2013