Member 12919448 Ответов: 0

Фильтрация не работает, сетка кендо


Привет,

Я использовал
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

Разбейте свой код на этапы. Сделайте так, чтобы каждый шаг работал. Сделайте шаг вперед и посмотрите, получает ли первый толчок отфильтрованные данные? Почему вам нужно запрашивать данные дважды?

0 Ответов