2015-09-02 3 views
0

Я использую AngularJS вместе с KendoUI для создания сетки, которая получает свои данные из веб-сервиса WebAPI. Для сетки я хочу разрешить сортировку на сервере, пейджинг, фильтрацию и группировку. Для этого я пытаюсь использовать библиотеку KendoGridBinderEx.KendoGridBinderEx - Нет свойства или поля в типе

Я загрузил источник KendoGridBinderEx, запустил пример проекта, и он отлично работает. Однако, когда я сделать то же самое в моем проекте, я получаю следующее сообщение об ошибке, когда я пытаюсь сделать фильтр на колонке в сетке:

System.Linq.Dynamic.ParseException: Нет Свойство или поле 'test' существует в типе 'MyEntity'

«test» - это то, что я набираю в фильтр, поэтому это должен быть текст фильтра; он не должен искать свойство или поле под названием «тест».

Я отлаживал и использовал Fiddler, чтобы увидеть, что часть фильтра, отправляемая в запросе, точно такая же, как и рабочий запрос в примерах, поэтому я не думаю, что проблема на стороне запроса ,

Для всех моих кодовых блоков я упрощаю все, чтобы сэкономить место и вырезать ненужные вещи. Например, я вырезаю свой код базы данных и создаю список объектов «на лету», так как при этом все еще возникает проблема, поэтому я знаю, что это не проблема с моим кодом Entity Framework.

Вот мой JS код:

var myDataSource = { 
     transport: { 
      read: { 
       url: function() { 
        return url; 
       }, 
       type: 'post', 
       dataType: 'json' 
      }, 
      parameterMap: function (options, operation) { 
       if (options.filter) { 
        KendoGrid_FixFilter(myDataSource, options.filter); 
       } 

       if (operation === "read") { 
        // convert the parameters to a json object 
        return kendo.stringify(options); 
       } 

       return options; 
      } 
     }, 
     serverPaging: true, 
     serverSorting: true, 
     serverFiltering: true, 
     serverGrouping: true 
     schema: { 
      data: 'data', 
      groups: 'groups', 
      aggregates: 'aggregates', 
      total: 'total', 
      model: { 
       id: "id", 
       fields: { 
        id: { type: "number" }, 
        name: { type: "string" }, 
        description: { type: "string" } 
       } 
      } 
     }, 
    }; 

И вот мой код WebAPI Контроллер:

[System.Web.Http.Route("api/MyEntity")] 
    [System.Web.Http.HttpPost] 
    public KendoGridEx<MyEntity, MyEntity> GetMyEntities(KendoGridApiRequest request) 
    { 
     var entList = new List<MyEntity>(); 
     for (int i = 0; i < 10; i++) 
     { 
      var newEntity = new MyEntity 
      { 
       Id = i, 
       Name = "test", 
       Description = "description" 
      }; 
      entList.Add(newEntity); 
     } 
     return entList.AsQueryable().ToKendoGridEx<MyEntity, MyEntity>(request); 
    } 

Так что, если я устанавливаю «содержит», фильтр на колонке «Имя» со значением из «теста» я получаю вышеупомянутую ошибку. Есть идеи о том, почему?

ответ

0

Нет Свойство или поле «тест» существует в типа «MyEntity» ..

Я думаю, что только значения Id, имя, описание можно найти .. сообщение саис «я поиск свойств и полей. . "

И Id, Name, Description являются единственным« свойством или полями ».

- «тест» является значение, а не свойство или field--

+0

Верно, что вся моя точка. Ни в одном из моих кодов я не пытаюсь сказать, что он ищет свойство или поле под названием «тест». Сообщение об ошибке очень плохое. Как оказалось, я нашел ответ, который состоял в том, что случаи (верблюд против Паскаля) были разными между моей сущностью и запросом. – RebelScum

0

После дня борется с этим, я, наконец, отправил на это сегодня. И, конечно, через несколько минут после вопроса, я наткнулся на ответ!

Проблема заключалась в том, что существует разница в обложке имен столбцов между моим JS-кодом на стороне клиента и моими сущностями. В моей WebApiConfig, я использую

 // Web API configuration and services 
     var settings = config.Formatters.JsonFormatter.SerializerSettings; 
     settings.Formatting = Formatting.Indented; 
     settings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 

Этот код делает это так, что, когда мои данные WebAPI возвращает все имена полей преобразуются в ГорбатыйРегистр. Это связано с тем, что я хотел кодировать все в случае с верблюдом на стороне JS, но с корпусом Pascal на стороне C#.

Первое, что меня отбросило, было то, что другие операции KendoGridApiRequest, такие как Sort, кажутся нечувствительными к регистру, когда дело касается имен свойств.Другое дело, что в сообщении об ошибке говорится, что он ищет значение фильтра как свойство; он должен был сказать: «Нет свойства или поля« имя »существует в типе« MyEntity »; то я, наверное, сразу узнал бы, что это был обрубок.

Теперь мне нужно выяснить, как я собираюсь преобразовать свойства запроса обратно в корпус Pascal. В худшем случае я должен преобразовать все в один и тот же случай, но это было бы большой работой (объекты более сложны, чем показывает мой пример).

0

Что вы можете сделать, так это изменить имена свойств, прежде чем кендо-сетка отправит их на сервер.

Таким образом, значение filter.field 'name' преобразуется в 'Name'.

Смотрите эту модифицированную KendoGrid_FixFilter Javascript функция:

// kendoDataSource = kendo.data.DataSource 
// filter = kendo filter 
function KendoGrid_FixFilter(kendoDataSource, kendoFilter, depth) { 
    if ((!kendoDataSource) || (!kendoFilter)) return; 

    if (!depth) depth = 0; 
    // console.log(depth + " - FixDatesInFilter:" + JSON.stringify(kendoFilter)); 

    $.each(kendoFilter.filters, function (idx, filter) { 
     //console.log("filter = " + idx + " = " + JSON.stringify(filter)); 

     if (filter.hasOwnProperty("filters")) { 
      depth++; 
      KendoGrid_FixFilter(kendoDataSource, filter, depth); 
     } 
     else { 
      $.each(kendoDataSource.schema.model.fields, function (propertyName, propertyValue) { 

       if (filter.field == propertyName) { 
        // console.log("before = " + filter.field); 
        filter.field = filter.field.toPascalCase(); 
        // console.log("after = " + filter.field); 
       } 

       if (filter.field == propertyName && propertyValue.type == 'date') { 
        filter.value = kendo.toString(filter.value, _DefaultDateFormat); // "MM/dd/yyyy" 
        // console.log("changed = " + filter.value); 
       } 
      }); 
     } 
    }); 
} 

Вы уже используете эту функцию в источнике данных.

Пример кода для CamelCase/PascalCase может быть что-то вроде этого:

String.prototype.toCamelCase = function() { 
    console.log("String.prototype.toCamelCase"); 
    return this 
     .replace(/\s(.)/g, function ($1) { return $1.toUpperCase(); }) 
     .replace(/\s/g, '') 
     .replace(/^(.)/, function ($1) { return $1.toLowerCase(); }); 
}; 

String.prototype.toUpperCaseFirstChar = function() { 
    console.log("String.prototype.toUpperCaseFirstChar"); 
    return this.substr(0, 1).toUpperCase() + this.substr(1); 
}; 


String.prototype.toPascalCase = function() { 
    console.log("String.prototype.toPascalCase"); 
    return this.toCamelCase().toUpperCaseFirstChar(); 
}; 
Смежные вопросы