Фильтрация не работает, сетка кендо
Привет,
Я использовал
kendo.dynamic.linq.DataSourceResultреализовать фильтрацию на стороне сервера.
[AcceptVerbs("GET","POST")] public DataSourceResult Filter(Models.DataSourceRequest request) { if (request != null) { request.Filter.Field = request.Filter.Filters.FirstOrDefault().Field; request.Filter.Operator = request.Filter.Filters.FirstOrDefault().Operator; request.Filter.Value = request.Filter.Filters.FirstOrDefault().Value; var o = request; } var employees = db.Users.OrderBy(ii => ii.Id).Select(x => new RegisterBindingModel() { Id = x.Id, Email = x.Email, UserName = x.UserName, FirstName = x.FirstName, LastName = x.LastName, Age = x.Age, Phone = x.Phone, Department = x.Department }); var i = employees.ToDataSourceResult(request.Take, request.Skip, request.Sort, request.Filter); var data = i.Data; // This is contain filtered data request.Take = i.Total; var d = Json(data); System.Diagnostics.Debug.WriteLine(d); var aa = data.Cast<RegisterBindingModel>().ToList(); var b = aa; // return Content(HttpStatusCode.OK,d.Content); return employees.ToDataSourceResult(request.Take, request.Skip, request.Sort, request.Filter); //return data.Cast <RegisterBindingModel>().ToList(); }
Ну, я видел данные фильтра от fiddler в теле этого запроса.
Что я уже пробовал:
Я использовал следующий код, я хочу обновить сетку с данными фильтра, но вместо этого сетка обновляется со всеми данными в пределах одной страницы !!
$scope.DS = new kendo.data.DataSource({ type: "json", transport: { read: { url: "/api/Employees", dataType: "json", contentType: "application/json", type: "GET", headers: { 'Authorization': 'Bearer ' + sessionStorage.getItem("accessToken") } }, update: { url: "/api/Employees/PUT", dataType: "json", contentType: "application/json", type: "PUT", headers: { 'Authorization': 'Bearer ' + sessionStorage.getItem("accessToken") } }, destroy: { url: "/api/Employees/DELETE", dataType: "json", contentType: "application/json", type: "DELETE", headers: { 'Authorization': 'Bearer ' + sessionStorage.getItem("accessToken") } }, create: { url: "/api/Employees/POST", dataType: "json", contentType: "application/json", type: "POST", headers: { 'Authorization': 'Bearer ' + sessionStorage.getItem("accessToken") } }, parameterMap: function (options, operation) { if (operation !== "read") { console.log(JSON.stringify(options.models)); return JSON.stringify(options.models); }}}, batch: true, pageSize: 5, serverFiltering: true, schema: { model: { id: "Id", data: 'Data', total: 'Total', // errors: 'Errors', fields: { Id: { editable: false, nullable: false, type: "number" }, Email: { editable: true, type: "string" }, UserName: {editable: true,type: "string"}, FirstName: { editable: true, type: "string" }, LastName: { editable: true, type: "string"}, Age: { editable: true, validation: { required: true } }, Phone: { editable: true, validation: { required: true } }, Department: { editable: true,type: "string"} } } }, }); $scope.mainGridOptions = { dataSource: $scope.DS, dataBound: function () { var data = this.dataSource.view(); }, toolbar: ["create"], columns: [ { field: "Email", title: "Email", width: "100px" }, { field: "UserName", title: "User Name", width: "100px"}, { field: "FirstName", title: "First Name", width:"100px"}, { field: "LastName", title: "Last Name", width: "100px" }, { field: "Phone", title: "Phone", width: "100px" }, { field: "Age", title: "Age", width: "100px" }, { field: "Department", title: "Department", width: "100px"}, { command: [{ name: "edit", text: { edit: "Edit", update: "Save", cancel: "Cancel" } }, "destroy"], title: "Actions", width: "150px" } ], filterable: true, pageable: { refresh: true, input: true, numeric: false, pageSizes: [5, 10, 20, 30, 50, 75, 100, 500, 1000] }, sortable: true, resizable: true, navigatable: true, serverFiltering: true, editable: { mode: "inline" }, filter: function (data) { console.log((data)); console.log((data.filter)); const requestOptions = { headers: { 'Authorization': 'Bearer ' + sessionStorage.getItem("accessToken") } }; $http.post("/api/Account/Filter", data, requestOptions).then(function (d) { console.log(JSON.stringify(d.data.Data)); // $scope.DS.read = d.data.Data; debugger; $scope.mainGridOptions.dataSource.query(d.data.Data); }, function () { alert("Failed.Please try again.") }); }, noRecords: { template: "No results available."} };
Не могли бы вы сказать, что я делаю не так??
Christian Graus
Покажите нам внутренний код, который реализует ваш файлер
Member 12919448
Это уже есть, см. Метод фильтра
Member 12919448
Я забочусь о фильтрации, поэтому фильтр получает данные фильтра. Сортировка равна нулю.
Member 12919448
Я использовал кендо.DynamicLinq, который принимает запрос фильтра и возвращает данные фильтра
Christian Graus
Я не видел этого раньше - вы отладили его, чтобы увидеть, проходит ли ваш фильтр и применяется ли он?
Member 12919448
Да, но это снова операция чтения и чтение всех данных, я думаю, что у меня есть проблема с тем, как читать данные фильтра и обновлять сетку. В самом начале ничего не изменилось, поэтому я попытался использовать $scope.mainGridOptions.dataSource.запрос(d.data.Data); после этого все данные возвращаются, я устанавливаю сторону страницы равной 5, но также это переопределение, и все данные отображаются в пределах одной страницы
Christian Graus
Итак, вы отладили и подтвердили, что ваши данные фильтра не проходят?
Member 12919448
Да, через отладку я вижу данные фильтра обратно в $scope.mainGridOptions.dataSource.запрос(d.data.Data); но, как я уже сказал, после этого он возвращается к операции чтения и считывает все данные.
Christian Graus
Если данные фильтра возвращаются, но он возвращает все данные, то ваш код неверен. Ты получаешь данные дважды. Фильтруется ли он в первый раз? Выживает ли переменная фильтра для использования во второй раз?
Member 12919448
Хорошо, что-то не так в этом $scope.mainGridOptions.dataSource.запрос(d.data.Data);?
Member 12919448
Если вы знаете пример проекта, который выполнял фильтрацию на стороне сервера, это будет здорово
Christian Graus
https://docs-да.telerik.com/aspnet-mvc/helpers/grid/binding/custom-binding
Member 12919448
Конечно, я прошел через это :). В любом случае, спасибо, что уделили мне время
Christian Graus
Разбейте свой код на этапы. Сделайте так, чтобы каждый шаг работал. Сделайте шаг вперед и посмотрите, получает ли первый толчок отфильтрованные данные? Почему вам нужно запрашивать данные дважды?