2016-08-18 3 views
0

Я воспроизвожу функциональность, очень близкую к тому, что видно здесь. https://onabai.wordpress.com/2013/07/17/kendoui-multiselect-in-a-grid-yes-we-can/Kendo Grid Inline MultiSelect - Добавленные значения

У меня есть сетка Kendo с встроенным полем редактирования мультиселектора. У меня есть событие datasource.sync(), которое вышло на смену этого мультиселектора. Проблема, с которой я столкнулась, заключается в том, как данные упорядочиваются в пост-переменных.

Я использую FireBug в FireFox. Я могу установить функцию для просмотра значений в моем поле multiselect, подобных этому в событии sync().

console.log(this.value());

Это было бы для поля строки массива я назвал «RoleCode». Во всяком случае, журнал консоли отображает значения, как они должны, например

A, OU

Однако, когда я смотрю на сообщение вызова на мой контроллер и при параметрах, я вижу поле RoleCode дублируется, что почему мой контроллер не распознает подпись метода. Например, это то, что я вижу в FireBug ...

ID 123 
Field1 TextFromField1 
RoleCode[1][RoleCode] OU 
RoleCode[] A 

Любая идея, как я должен установить это так, почтовые параметры могут использоваться?

UPDATE

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

update: { 
      url: "Home/GridUpdate", 
      type: "POST", 
      dataType: "json", 
      data: function() { 
       //Grid does not post multiselect array correctly, need to convert to a string 
       var rolesString = $("#gridRoleList").data("kendoMultiSelect").value().toString(); 
       return { rolesString: rolesString }; 
      }, 
      complete: function (e) { 
       setTimeout(function() { 
        refreshGrid(); 
       }, 300); 
      }, 
      success: function (result) { 
       // notify the data source that the request succeeded 
       options.success(result); 
      }, 
      error: function (result) { 
       // notify the data source that the request failed 
       options.error(result); 
      } 
     }, 

UPDATE 2

На самом деле это не очень хорошая идея, потому что, если я редактировать другое поле в сетке, я получаю ошибку JS, потому что MultiSelect не найден.

ответ

0

Вот как я это решил. В событии изменения функции редактора я обновил значение модели со значением мультиселектора. Затем данные корректно помещаются как строковый массив.

ID 123 
Field1 TextFromField1 
RoleCode[] A 
RoleCode[] OU 

Мой редактор сетки функция

function roleMultiSelectEditor(container, options) { 
    $('<input id = "gridRoleList" name="' + options.field + '"/>') 
     .appendTo(container) 
     .kendoMultiSelect({ 
      dataTextField: "RoleCode", 
      dataValueField: "RoleCode", 
      autoBind: true,  
      change: function (e) { 
       //Applies the value of the multiselect to the model.RoleCode field 
       //Necessary to correctly post values to controller 
       options.model.RoleCode = this.value(); 
       processGridMultiSelectChange(); 
      }, 
      dataSource: { 
       type: "json", 
       transport: { 
        read: { 
         dataType: "json", 
         url: baseUrl + "api/DropDownData/RoleList", 
        }, 
       } 
      }, 
      dataBound: function (e) { 
      } 
     }); 
} 
0

Похоже, ваша проблема может быть решена путем передачи данных после того, как сериализация

Read действие - с помощью MVC Wrapper

.Create(create => create.Action("Create", "Home").Data("serialize")) 

JS код

<script type="text/javascript"> 

function serialize(data) { 
    debugger; 
    for (var property in data) { 
     if ($.isArray(data[property])) { 
      serializeArray(property, data[property], data); 
     } 
    } 
} 

function serializeArray(prefix, array, result) { 
    for (var i = 0; i < array.length; i++) { 
     if ($.isPlainObject(array[i])) { 
      for (var property in array[i]) { 
       result[prefix + "[" + i + "]." + property] = array[i][property]; 
      } 
     } 
     else { 
      result[prefix + "[" + i + "]"] = array[i]; 
     } 
    } 
} 


</script> 

Please refer here for complete source code

+0

Спасибо. Я думаю, что это то, что мне нужно, но я не использую обертки MVC. Любая идея, как запустить данные с помощью этих функций в событии datasource.sync() или в функции обновления транспорта? – madvora

+0

Вы можете использовать transport.read.функция данных для отправки дополнительных параметров из JS. Пожалуйста, обратитесь к документации Kendo UI здесь. http://docs.telerik.com/kendo-ui/api/javascript/data/datasource#configuration-transport.read.data –

Смежные вопросы