我正在使用mvc4。在我的一个页面上,它有Kendo Grid。我想每页显示5行。使用纯javascript我没有问题,但是,如果我使用的是mvc helper。我迷路了,无法在网上找到任何样品。
这是我的javascript代码。
<script language="javascript" type="text/javascript">
$(document).ready(function () {
$("#grid").kendoGrid({
dataSource: {
type: "json",
serverPaging: true,
pageSize: 5,
transport: { read: { url: "Products/GetAll", dataType: "json"} },
schema: { data: "Products", total: "TotalCount" }
},
height: 400,
pageable: true,
columns: [
{ field: "ProductId", title: "ProductId" },
{ field: "ProductType", title: "ProductType" },
{ field: "Name", title: "Name" },
{ field: "Created", title: "Created" }
],
dataBound: function () {
this.expandRow(this.tbody.find("tr.k-master-row").first());
}
});
});
现在如果我正在使用mvc helper
@(Html.Kendo().Grid(Model)
.Name("Grid") //please help me to finish the rest
更新:
添加操作代码。
[HttpPost]
public ActionResult GetAll([DataSourceRequest]DataSourceRequest request, int id)
{
var products= ProductService.GetAll(id);
return Json(products.ToDataSourceResult(request));
}
服务层中的GetAll方法:
public IQueryable<Product> GetAll(int id)
{
var products= ProductRepository.Get(p => p.Id== id && p.IsActive == true, null, "ProductionYear")
.OrderBy(o => o.Name); //.ToList();
return Product.Select(p => new ProductVM()
{
Name = p.Name,
ProductionYear= p.ProductionYear.Year.ToString()
Id = p.Id
}).AsQueryable();
}
现在,如果我运行应用程序,我将收到以下错误:
&#34; LINQ to Entities无法识别方法&#39; System.String ToString()&#39;方法,此方法无法转换为商店表达式。&#34;}
在GetAll方法中,我注释掉&#34; ToList()&#34;。如果我使用ToList,一切正常。但我会查询所有行,而不是那个页面所需的那些行。答案 0 :(得分:5)
您可以在DataSource method内设置PageSize
。所以你需要这样的东西:
@(Html.Kendo().Grid(Model)
.Name("Grid")
.DataSource(dataSource => dataSource.Ajax()
.PageSize(5)
.Read(c => c.Action("GetAll", "Products")
.Model(s => s.Id(m => m.Id)))
.Columns(columns =>
{
columns.Bound(m => m.ProductId).Title("ProductId");
//other colums
})
.Events(g => g.DataBound("somefunction"))
.Pageable(true))
您可以在KendoUI Grid的Asp.NET MVC wrappers documentation找到更多信息。
答案 1 :(得分:5)
如果您不使用Kendo的ASP.NET MVC包装并直接使用Kendo JavaScript对象和您正在尝试进行服务器端分页,那么您需要按如下方式创建数据源:
var dataSource = {
"type":"aspnetmvc-ajax",
"serverSorting": true,
"serverPaging": true,
"page": 1,
"pageSize": 8,
"schema": {
"data":"items",
"total":"count",
"errors":"errors"
}
};
您的Read控制器方法将类似于:
public ActionResult List_Read([DataSourceRequest]DataSourceRequest request) {
try {
var model = null /* prepare your model object here contain one page of grid data */;
// using Json.NET here to serialize the model to string matching the
// schema expected by the data source
var content = JsonConvert.SerializeObject(new { count = model.Count, items = model.Items }, Formatting.None);
return Content(content, "application/json");
}
catch (Exception exception) {
// log exception if you need to
var content = JsonConvert.SerializeObject(new { errors = exception.Message.ToString() }, Formatting.None);
return Content(content, "application/json");
}
}
type
,serverSorting
和serverPaging
对于确保在服务器端进行分页和排序非常重要。 type
必须为aspnetmvc-ajax
,否则将无法通过Read方法中[DataSourceRequest]属性指定的模型绑定器识别查询数据。除非要编写自己的自定义模型绑定器来解析由kendo dataSource发送的查询数据,否则不能省略该属性,这不符合ASP.NET MVC中DefaultModelBinder使用的模型绑定约定。
答案 2 :(得分:0)
如果您使用的是用于ASP.NET MVC的Kendo UI,则另一个答案将起作用。如果你不这样做,你需要自己实现分页。在发出请求时,Kendo DataSource将发送pageSize和当前页面。您可以使用它来进行分页。它还发送“take”和“skip”,这使得事情变得更加容易(提示Linq)。
答案 3 :(得分:0)
错误 “LINQ to Entities无法识别方法'System.String ToString()'方法,并且此方法无法转换为商店表达式。”} 是自我解释,为了解决这个问题,你应该做一些像
这样的事情return Product.**AsEnumerable**.Select(p => new ProductVM()
{
Name = p.Name,
ProductionYear= p.ProductionYear.Year.ToString()
Id = p.Id });
使用AsEnumerable会带来db中的所有记录,因此最好在任何过滤后使用
products.where(x => x.active = true).AsEnumerable
而不是
products.AsEnumerable.where(x =&gt; x.active = true)
答案 4 :(得分:0)
下载kendo示例,然后解压缩并关注
ASP.NET MVC Q1 <your directory>\Kendo UI
2013\wrappers\aspnetmvc\Examples\Areas\razor\Views\web\grid\
对于视图索引
和
ASP.NET MVC Q1 <your directory>\Kendo UI
2013\wrappers\aspnetmvc\Examples\Controllers
for IndexController
在您的视图中,您可能还需要.ServerOperation(true),如下所示 使用JSON JavaScriptSerializer进行序列化或反序列化时出错。字符串的长度超过maxJsonLength属性上设置的值。 如果您要获取大数据
@(Html.Kendo().Grid(<yourmodel>)
.Name("Grid")
.Columns(columns =>
...
})
.Filterable()
.Pageable()
.DataSource(dataSource => dataSource
.Ajax()
.PageSize(8)
.ServerOperation(true) )
.Model(model =>
{
model.Id(p => p.Id);
...
})
)
)
也在ActionResult Products_Read的控制器中考虑
DataSourceResult result = GetProducts().ToDataSourceResult(request, o => new { Id = o.Id, ... } );
return Json(result , JsonRequestBehavior.AllowGet);