2013-12-10 127 views
0
@(Html.Kendo().Grid<RTM.WEB.MVC.ViewModels.SortingViewModel.ProductViewModel>() 
.Name("ProductsGrid").HtmlAttributes("height:430") 
.Columns(columns => 
{ 
columns.Bound(p => p.IsSelected).Width(50).Title(""); 
columns.Bound(p => p.ProductName); 
columns.Bound(p => p.Price).Format("{0:C}"); 
columns.Bound(p => p.GroupName); 
// columns.Bound(p => p.MeasurementId); 
// columns.Bound(p => p.BarcodeValue); 
columns.Command(comand => 
{ 
comand.Custom("Edit").Click("ViewEdit"); 
comand.Destroy(); 

}).Title("Commands").Width(180); 

}) 
.DataSource(dataSource => dataSource 

.Ajax() 
.PageSize(10) 
//.Events(events=>events.Sync("addGroupData")) 
.ServerOperation(true) 
.Batch(true) 

.Events(events => 
{ 
events.Error("errorHandler"); 
events.Sync("addDataToResponce"); 
}) 
.Model(model => 
{ 
model.Id(p => p.ProductId); 
model.Field(p => p.ProductId).Editable(false); 
}) 

//          .Aggregates(aggregates => 
//{ 
// //aggregates.Add(p => p.ProductId); 
// //aggregates.Add(p => p.ProductName); 
// aggregates.Add(p => p.Price).Sum(); 
//}) 


.Group(groups => groups.Add(p => p.GroupName)) 

.Create(create => create.Action("Products_Create", "Sorting")) 
.Read(read => read.Action("Products_Read", "Sorting")) 
.Update(update => update.Action("Products_Update", "Sorting")) 
.Destroy(destroy => destroy.Action("Products_Destroy", "Sorting")) 
) 
.ToolBar(toolbar => 
{ 
toolbar.Template(@<text> 
<div > 
<a class="k-button" onclick="AddProduct()">Add New Product</a> 
@item.SaveButton() 
<a class="k-button" onclick="NewGroup()">NewGroup</a> 
<a class="k-button" onclick="UnGroup()">UnGroup</a> 
<label>Show products by warehouse:</label> 
@(Html.Kendo().DropDownList() 
.Name("warehouses") 
.OptionLabel("All") 
.DataTextField("Name") 
.DataValueField("WarehouseId") 
.AutoBind(false) 
// .Events(e => e.Change("warehousesChange")) 
.DataSource(ds => 
{ 
ds.Read("Products_Warehouses", "Sorting"); 

}) 
) 
</div> 
</text>); 

}) 
.Events(events => 
{ 
events.DataBound("dataBound"); 
}) 
.Pageable(page => page.PageSizes(true).Numeric(false).Refresh(true).Input(true)) 
//.Navigatable() 
.Selectable() 
.ColumnMenu() 
.Filterable() 
.Sortable() 
.Scrollable() 
.Editable(editable => editable.Mode(GridEditMode.InCell).DisplayDeleteConfirmation(false)) 
) 
public JsonResult Products_Read([DataSourceRequest]DataSourceRequest request) 
{ 
int allcount=0; 
List<ProductModel> products= DataManager.ProductRepository.GetAllProducts(request.Page, request.PageSize,ref allcount); 
List<ProductViewModel> productViewModels=new List<ProductViewModel>(); 
foreach (var product in products) 
{ 
productViewModels.Add(ConvertProductViewModel(product)); 
} 
if (request.Sorts.Count != 0) 
{ 
string member = request.Sorts.First().Member; 
string sorttype = request.Sorts.First().SortDirection.ToString(); 
switch (member) 
{ 
case "IsSelected": 
if (sorttype == "Ascending") 
{ 
productViewModels = productViewModels.OrderBy(p => p.IsSelected).ToList(); 
} 
if (sorttype == "Descending") 
{ 
productViewModels = productViewModels.OrderByDescending(p => p.IsSelected).ToList(); 
} 
break; 
case "ProductName": 
if (sorttype == "Ascending") 
{ 
productViewModels = productViewModels.OrderBy(p => p.ProductName).ToList(); 
} 
if (sorttype == "Descending") 
{ 
productViewModels = productViewModels.OrderByDescending(p => p.ProductName).ToList(); 
} 
break; 
case "Price": 
if (sorttype == "Ascending") 
{ 
productViewModels = productViewModels.OrderBy(p => p.Price).ToList(); 
} 
if (sorttype == "Descending") 
{ 
productViewModels = productViewModels.OrderByDescending(p => p.Price).ToList(); 
} 
break; 
} 

} 


var result = new DataSourceResult() 
{ 
Data = productViewModels, 
Total = allcount, 
AggregateResults = null, 
Errors = null, 
}; 
return Json(result, JsonRequestBehavior.AllowGet); 
} 

这是我的代码。当我从动作服务器返回数据时分页不起作用。 我想做服务器分页kendo ui组网格,但是响应数据类型为undefined.I需要组网格的工作示例。它在基本网格中工作,但不适用于组网格。Asp.Net MVC KendoUI网格

回答

2

您应该只需要更新控制器方法。由于您正在进行的排序似乎非常基本,您可以使用提供的Kendo方法ToDataSourceResult(DataSourceRequest request)

以下添加到您的使用一节中的控制器:

using Kendo.Mvc.Extensions; 

然后简单的返回:

return Json(productViewModels 
    .ToDataSourceResult(request, JsonRequestBehavior.AllowGet)); 

这应该照顾任何过滤,排序,分组和分页为您服务。

您可能还想看看AutoMapper,以更轻松地将Product中的对象映射到ProductViewModel

+0

怎么发送总数? – Narek

+0

如果您更改代码'DataManager.ProductRepository.GetAllProducts(request.Page,request.PageSize,ref allcount);'只返回所有对象,'ToDataSourceResult'方法将负责分页和总计。如果你想将分页传递回数据库,那么我会建议看看AutoMapper,因为这会让你做'... ProductRepository.GetAllProducts()。Select(AutoMapper.Map )。ToDataSourceResult(... )'。 – niventc

+0

我不想从数据库获取所有数据,因为如果数据太多,它的工作速度非常慢。 – Narek