Kendo, как выполнить подкачку Grid-сервера с помощью помощника mvc4
-
13-12-2019 - |
Вопрос
Я использую mvc4.На одной из моих страниц есть Kendo Grid.Я хочу показать 5 строк на странице.Однако у меня нет проблем с использованием чистого JavaScript, если я использую помощник MVC.Я заблудился, не нашел в сети образцов.
вот мой код 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
@(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();
}
теперь, если я запущу приложение, я получу следующую ошибку:
«LINQ to Entities не распознает метод System.String ToString(), и этот метод невозможно преобразовать в выражение хранилища».}
в методе GetAll я закомментирую «ToList()».Если я использую ToList, все работает.но вместо этого я верну все строки только те строки, которые мне нужны для этой страницы.
Решение
Вы можете установить PageSize
внутри Способ данных DataSource .Таким образом, вам понадобится что-то вроде:
@(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))
.
Вы можете найти более подробную информацию «http://docs.kendoui.com/getting-start-mvc/helpers/grid/shence / rufers/grid/usdourie.com/getting-Startedooui.com/getting-Startedooui.com/getting-started/using-kendo-with-Started/using-kendo-with/aspneed-mvc/helpers/grid/overview" Rel="noreferrer«> Документация по оберткам ASP.NET MVC .
Другие советы
Если ты нет используя оболочки 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"
}
};
И ваш метод контроллера чтения будет выглядеть примерно так:
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
, в противном случае данные запроса не будут распознаны связывателем модели, указанным атрибутом [DataSourceRequest] в методе Read.Вы не можете опустить этот атрибут, если не хотите написать свой собственный модуль привязки модели для анализа данных запроса, отправленных источником данных kendo, который не соответствует соглашениям о привязке модели, используемым DefaultModelBinder в ASP.NET MVC.
Другой ответ будет работать, если вы используете KENDO UI для ASP.NET MVC.Если вам вам не нужно реализовать пейджинг самостоятельно.DataSource Kendo отправит PageSitive и текущую страницу при проведении запроса.Вы можете использовать это, чтобы сделать пейджинг.Он также отправляет «взять» и «пропустить», что делает вещи еще проще (Hint linq).
ошибка «Linq к объектам не распознает метод метода« System.String ToString () », и этот метод не может быть переведен в выражение хранения».} Является ли самочувствительным, чтобы погладить это, вы должны сделать что-то вроде
return Product.**AsEnumerable**.Select(p => new ProductVM()
{
Name = p.Name,
ProductionYear= p.ProductionYear.Year.ToString()
Id = p.Id });
.
Использование aseUmerable приносит все записи из БД, поэтому наилучшим образом использовать после любой фильтрации
products.where(x => x.active = true).AsEnumerable
.
Скорее тогда Products.aseNumerable. Где (x=> x.active= true)
Скачать примеры Kendo, затем расстегивайте и следуйте
<your directory>\Kendo UI
для ASP.NET MVC Q1 GeneracodicCode
Для индекса зрения
а также
2013\wrappers\aspnetmvc\Examples\Areas\razor\Views\web\grid\
для ASP.NET MVC Q1 GeneracodicCode
Для индексаконтроллера
На вашем представлении вы можете также захотеть .serveroperation (true) как ниже, чтобы избежать Ошибка во время сериализации или десериализации с использованием JSON Javascripterializer.Длина строки превышает значение, установленное на свойство 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);
.