我正在尝试使用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());
}
使用firebug我可以清楚地看到请求的状态代码为“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)
告诉我我的参数无效
提前致谢。
答案 0 :(得分:5)
我想我很清楚你为什么会这样,也发生在我身上。
MVC包装器提供网格模型处理服务器上数据的方式的默认值(将数据源序列化为具有“数据记录”和支持“元数据”的对象)。但是,如果你自己这样做,因为你没有定义自己的密钥,你就会遇到一个默认密钥'Records',用于过滤响应,因为它不在那里。你得到'未定义'数据馈送到网格:))
所以解决方案:
1)使用网格的“ResponseDataKey”属性包装您的响应并定义匹配键。我建议这样做,因为据我所知,将响应包装在一个对象中是一种很好的做法 - 认为存在一些安全隐患。
2)如果您不想这样做而只是想让它正常工作现在然后将“ResponseDataKey”设置为空字符串(“”将会这样做)所以您的回复将被正确过滤(或者更确切地说不是)。
在将网格直接绑定到视图中的模型数据的第二部分 - 就我所见,你正确地得到了错误。 DataSource property明确声明源必须实现IQueryable而不是IEnumerable。在那里打一个.AsQueryable(),这也应该可以正常工作。
请告诉我这是否有帮助:)