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

7
当我尝试将datatable绑定到Telerik Kendo网格时,出现以下错误:
索引超出范围。必须是非负数且小于集合的大小。
我已经按照Telerik的示例项目进行了操作,但在我的代码中,似乎在“DataSource”的“Read”函数上失败了:
.Read(read => read.Action("Read", "Events"))
我目前的ActionResult Read()返回null,只是因为我想看看它是否能够到达该函数。此外,我已经逐步执行了代码,并且datatable返回了正确的列和列名称。
感谢您的帮助。
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: 索引超出范围。必须是非负数且小于集合大小。 参数名: 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

如果返回一个空结果集,它是否有效? - Brian Mains
@BrianMains - 我将其设置为返回一个空数据表,但仍然得到了相同的错误。 - fortune
3个回答

10

事实证明这与我的web.config有关。我在创建每个Kendo对象时都遇到错误。将以下代码添加到顶层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>

1
错误的可能原因之一是,如果您的项目是一个“遗留”项目,并且已经添加了Kendo UI,则可能会加载早于4.0版本的System.Web.Mvc。当数据从服务器返回时,格式无法识别,从而导致错误。通过在顶级web.config中添加此内容,您可以强制使用最新版本来加载您的站点。 - RCGoforth

4
通过在解决方案的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>

0

我猜测错误发生的原因是Read操作没有返回有效的结果集。

通常情况下,当以Ajax模式读取时,Kendo网格需要返回一个JsonResult。如果您返回一个正确格式化为json结果的空DataTable,那么我认为这个问题就会得到解决。

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

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


我已经做了那个更改,但是我仍然收到错误。我在进入该函数时设置了断点,但它甚至没有达到那个位置。这个错误可能是由于找不到操作或控制器引起的吗? - fortune
你能在浏览器中监视ajax请求并查看响应码吗?HTTP状态码会告诉你路由是否无法找到,或者是否存在授权问题或服务器错误。 - Matt B
我现在就看一下。另外,我已经更新了我的帖子,并附上了堆栈跟踪,不确定是否有帮助。 - fortune
HTTP 返回状态码 500。 - fortune
我将我的代码的一部分移入了Telerik项目中,现在它正在生成网格。我需要找到导致问题的确切代码片段。感谢您的帮助。 - fortune
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接