Kendo ui multiselect в источнике данных обновления сетки - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть мультиселектор кендо пользовательского интерфейса в сетке кендо пользовательского интерфейса.Он отлично работает при чтении значений из удаленного источника данных, но когда выдает ошибку при обновлении, потому что он отправляет массив множественных значений неожиданным образом.

js код ниже.Метод GetEmployeeTitles возвращает список строк.

    var sharedTitleDataSource = new kendo.data.DataSource({
        transport: {
            read: "./GetEmployeeTitles"
        }
    });

    $("#grid").kendoGrid({
        dataSource: {
            transport: {

                read: {
                    url: "./GetLaborCodes",

                },
                update:
                {
                    url: "./UpdateLaborCode",
                    type: "POST",
                },
                create:
                {
                    url: "./UpdateLaborCode",
                    type: "POST",
                },
                parameterMap: function (data, type) {
                    console.log(data);
                    console.log(type);
                    if (type != "read") {
                        return data;
                    }
                }
            },
            schema: {
                model: {
                    id: "LaborCode_ID",
                    fields: {
                        LaborCode_Name: { type: "string" },
                        LaborCode_Titles: {}
                    }
                }
            },
        },
        editable: true,
        filterable: true,
        sortable: true,
        batch: true,
        resizable: true,
        reorderable: true,
        columns: [{
                field: "LaborCode_Titles",
                template: function (dataItem) {
                    return dataItem.LaborCode_Titles.join(', ');
                },
                title: "Titles",
                editor: function (container, options) {
                    $('<select multiple="multiple" name="' + options.field+'"/>')
                        .appendTo(container)
                        .kendoMultiSelect({
                            suggest: true,
                            dataSource: sharedTitleDataSource,
                            valuePrimitive: true,
                            autoWidth: true
                        });
                }
            },
        {
            field: "LaborCode_Name",
            title: "Name",
            editor: function (container, options) {
                var input = $('<textarea maxlength="450" name="' + options.field + '"></textarea>');
                input.appendTo(container);
            },
            template: function (dataItem) {
                if (dataItem.LaborCode_Name != null) {
                    return '<span title="' + dataItem.LaborCode_Name + '">' + dataItem.LaborCode_Name.substring(0, 30) + '...' + '</span>';
                }
                return '';
            }
        }
        ]
    });

А вот мой класс viewmodel:

public class LaborCodeViewModel
{
    public string LaborCode_Name { get; set; }
    public long LaborCode_ID { get; set; }
    public string[] LaborCode_Titles { get; set; }
}

И мой метод обновления в бэкенде, ничего особенного, он просто обновляет базу данных:

    [HttpPost, ValidateInput(false)]
    public JsonResult UpdateLaborCode(LaborCodeViewModel UpdatedM)
    {
        UpdatedM.LaborCode_ID = RateSheetAppFactory.UpdateInsertNewLaborCode(UpdatedM);
        return Json(UpdatedM, JsonRequestBehavior.AllowGet);
    }

Проблема заключается в том, что свойство LaborCode_Titles в LaborCodeViewModel равно нулю.Когда я проверяю запрос от инструментов разработчика, данные формы выглядят так:

LaborCode_Name: Project Executive
LaborCode_Titles[]: Sr. Project Manager
LaborCode_Titles[]: Lead Designer

Но это должно быть так:

LaborCode_Name: Project Executive
LaborCode_Titles: [Sr. Project Manager,Lead Designer]

Когда я записываю данные в parameterMapФункция для консоли, нет ничего плохого:

LaborCode_ID: 5
LaborCode_Name: "Project Executive"
LaborCode_Titles: (2) ["Sr. Project Manager", "Lead Designer"]

Как я могу опубликовать LaborCode_Titles в запросе в виде массива?Insead of

LaborCode_Titles []: старший менеджер проектов

я хочу отправить его вот так

LaborCode_Titles: [Sr.Руководитель проекта]

1 Ответ

0 голосов
/ 22 февраля 2019

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

  1. изменить HTTP-заголовок типа содержимого, отправляемый на сервер, чтобы указать, что полезной нагрузкой является JSON
  2. , сериализовать данные в JSONкак часть parameterMap функции

Согласно документации кендо это основная причина использования функции parameterMap:

Функция, которая преобразует параметры запроса в формат, подходящий для удаленного обслуживания.По умолчанию источник данных отправляет параметры, используя соглашения jQuery.Метод parameterMap часто используется для кодирования параметров в формате JSON.

$("#grid").kendoGrid({
    dataSource: {
        transport: {
            read: {
                url: "./GetLaborCodes",
            },
            update:
            {
                url: "./UpdateLaborCode",
                contentType: "application/json",
                type: "POST",
            },
            create:
            {
                url: "./UpdateLaborCode",
                contentType: "application/json",
                type: "POST",
            },
            parameterMap: function (data, type) {
                console.log(data);
                console.log(type);
                if (type != "read") {
                    return JSON.stringify(data);
                }
            }
        },
        schema: {
            model: {
                id: "LaborCode_ID",
                fields: {
                    LaborCode_Name: { type: "string" },
                    LaborCode_Titles: {}
                }
            }
        },
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...