3

我正在尝试使用 Infragistics 的网格来显示我的数据库中的项目列表。我在带有 Razor 引擎的 MVC 应用程序中使用代码优先方法和实体框架。除了 Infragistics 网格之外,视图中的所有内容都运行良好。

这是我的家庭视图:

@using Infragistics.Web.Mvc
@model IEnumerable<BusinessModel.Models.TestPlan>

@{
    ViewBag.Title = "Home";
}

@( Html.Infragistics().Grid<BusinessModel.Models.TestPlan>(Model)
.AutoGenerateColumns(true)
.DataSourceUrl(Url.Action("igListTestPlan"))
.DataBind()
.Render())

这是我的控制器:

[GridDataSourceAction]
public ActionResult igListTestPlan()
{
    return View(service.getListTestPlan());
}

使用萤火虫我可以清楚地看到发送的请求带有状态代码“200 OK”,但响应选项卡是空的。它还会在控制台中导致错误(在 infragistics.js 中):

Uncaught TypeError: Cannot read property 'length' of undefined 

我想这是因为空的响应。

我尝试了什么:

调试我的控制器显示我return View(service.getListTestPlan());没有返回一个空列表:我有 3 个有效项目。

我也尝试过Html.Infragistics().Grid<BusinessModel.Models.TestPlan>(Model__.ToList()),但没有任何改变。还Html.Infragistics().Grid(Model)告诉我我的参数无效

提前致谢。

4

1 回答 1

5

我想我很清楚为什么你会得到这个,也发生在我身上。

MVC 包装器为网格模型处理服务器上的数据的方式提供默认值(将数据源序列化为具有数据“记录”和支持“元数据”的对象)。但是,如果您自己这样做,因为您没有定义自己的键,那么您会被用于过滤响应的默认键“记录”卡住,并且因为它不存在......好吧,您会得到“未定义”的数据到网格:)

所以解决方案:

  • 1)使用网格的“ResponseDataKey”属性包装您的响应并定义匹配键。我之所以建议这样做,是因为据我记得将响应包装在单个对象中是一种好习惯——认为这会带来一些安全隐患。

  • 2)如果您不想这样做并且只想让它现在工作,那么将“ResponseDataKey”设置为空字符串(“”会这样做),这样您的响应将被正确过滤(或者更确切地说不是)。

在将网格直接绑定到视图中的模型数据的第二部分 - 据我所知,您正确地得到了错误。DataSource 属性明确指出源必须实现 IQueryable 而不是 IEnumerable 。在那里拍一个 .AsQueryable() ,它也应该可以正常工作。

让我知道这是否有帮助:)

于 2012-10-31T09:23:02.370 回答