Я пытаюсь получить данные Kendo Grid, которые гидратируются со стороны клиента, в метод контроллера MVC. Мое представление содержит несколько отдельных полей, таких как имя, дата рождения и т. д., а также табличное поле, которое я подключил с помощью Kendo Grid. Поскольку это новая операция, у меня нет данных в сетке (и других полях), и пользователь вводит их со стороны клиента.
Я понятия не имею, как это сделать. В идеале я хотел бы получить эти данные в список в моем режиме просмотра. Таким образом, когда пользователь нажимает «Сохранить», все остальные данные и данные сетки поступают в метод контроллера.
Я могу успешно связать список с сеткой кендо и отобразить его. У меня очень мало опыта в JavaScript, кендо и веб-программировании. Если кто-то из вас может указать мне правильное направление, пример кода будет принят с благодарностью.
$("#departmet").kendoGrid({
dataSource: dataSource,
height: 250,
scrollable: true,
sortable: true,
filterable: true,
pageable: {
input: true,
numeric: false
},
columns: [
"DepartmentName",
"SubDivision"
]
});
По опыту я знаю, что в их документации нелегко ориентироваться. Кажется, есть документация, а затем API. Обычно API — это то, что вы всегда хотите найти. Вам понадобится информация отсюда https://docs.telerik.com/kendo-ui/api/javascript/ui/grid. Если я правильно понял вопрос. Есть несколько способов добиться публикации. Вы можете использовать шаблоны редактора. Щелкните Open in Dojo, чтобы получить представление о том, как это выглядит.
https://docs.telerik.com/kendo-ui/api/javascript/ui/grid/configuration/editable.template
При этом вам не нужно беспокоиться об изменении данных с помощью javascript. Предполагая, что ваша сетка окружена элементом формы, он будет опубликован при отправке. Пейджинг заметок здесь не учитывается. Кроме того, этот метод по умолчанию может автоматически публиковать сообщения после каждого редактирования. Если вы не хотите такого поведения, вам необходимо иметь дополнительные знания об API..... Исправление в этом последнем утверждении. API отличается при работе с данными на стороне клиента. Нажмите «Открыть в Dojo», чтобы увидеть все это на стороне клиента. Если вы не хотите использовать шаблоны редактора и хотите самостоятельно управлять редактированием данных, вам необходимо использовать предоставленные методы сетки.
После того, как вы создали сетку. Чтобы получить доступ к источнику данных сетки, вам нужно получить dataSource.
$('#departmet').data('kendoGrid').dataSource;
https://docs.telerik.com/kendo-ui/api/javascript/data/datasource
Если вам нужно использовать другой источник данных (или изменить его), вы можете использовать метод setDataSource ниже (функция сетки).
https://docs.telerik.com/kendo-ui/api/javascript/ui/grid/methods/setdatasource
Чтобы добавить в источник данных, используйте функцию добавления, чтобы добавить новый объект.
$('#departmet').data('kendoGrid').dataSource.add({id: 2, name: 'name'});
https://docs.telerik.com/kendo-ui/api/javascript/data/datasource/methods/добавить
В кендо важно ВСЕГДА использовать предоставленные методы для изменения источника данных, чтобы могли запускаться соответствующие события для соответствующего обновления пользовательского интерфейса. Это включает в себя, если вам нужно установить свойство для определенного элемента данных. В этом случае вам нужно использовать метод set для самого элемента.
После того, как вы закончите изменять свои данные. В javascript получите данные и либо создайте элементы DOM в форме
//JQuery sudo code example
var data = $("#departmet").data("kendoGrid").dataSource.data();
var dataLen = data.length;
var myForm = $('#my-form'); //Already within DOM
for (var i = 0; i < dataLen; i++) {
var item = data[i];
var idEl = $('<input type = "hidden" name = "userData[' + i + '].id" />');
idEl.val(item.id);
var nameEl = $('<input type = "hidden" name = "userData[' + i + '].name" />');
nameEl.val(item.name);
myForm.append(idEl);
myForm.append(nameEl);
}
myForm.submit();
Это предполагает, что ваша функция контроллера (??) на бэкэнде ожидает массив объектов с именем свойства userData.
Кроме того, вы можете опубликовать его через ajax. Например, функция ajax jquery. Передача ваших данных в качестве данных вызова ajax.
http://api.jquery.com/jquery.ajax/
Не хочу бродить. Дай мне знать, если тебе еще понадобится помощь.
Итак, после некоторых усилий я придумал. Но я не знаю, где указать данные в html-коде. Возможно ли это таким образом?
@(Html.Kendo().Grid <DockData.Action> ()
.Name("docworkflow")
.Columns(columns =>
{
columns.Bound(e => e.ActionName);
columns.Bound(e => e.ActionType);
}).DataSource( **How do I load a script variable here***)
//This script variable should be fed to the above code.
This variable is populatedwhen the user adds data from the UI which works fine.
var dataSource = new kendo.data.DataSource({
data: result,
schema: {
model: {
fields: {
ActionName: { type: "string" },
ActionType: { type: "string" }
}
}
},
pageSize: 20
});
SO не позволит мне комментировать, поэтому нужно добавить еще один ответ. Вам не нужно будет определять источник данных в коде .NET при работе только с данными клиента. Просто используйте это.
.DataSource(dataSource => dataSource
.Ajax()
.ServerOperation(false)
)
Если у вас будут данные, поступающие из бэкэнда, вам нужно использовать универсальный конструктор и передать объект, иначе сохраните то, что у вас есть.
Html.Kendo().Grid(Model.MyList)
Однако, если вы выполняете предварительную обработку некоторых клиентских данных на экране, который хотите инициализировать, вам нужно будет сделать это при готовности. Не беспокойтесь о части схемы источника данных. Это уже известно, когда вы использовали оболочку .NET MVC, потому что вы дали ей схему (тип) через общий или предоставленный параметр.
var initialDS= new kendo.data.DataSource({
data: [
{ ActionName: "Some Name", ActionType: "Some Type" }
]
});
$(document).ready(function () {
$('#docworkflow').data('kendoGrid').setDataSource(initialDS);
});
Как я уже упоминал в другом ответе. Используйте функции источника данных для добавления дополнительных данных в источник данных. Нет необходимости устанавливать DataSource каждый раз, когда вы хотите добавить. Только что
//Assuming you have 2 inputs on the screen the user is entering info into
var nameEntry = $('#action-name').val();
var typeEntry = $('#action-type').val();
$('#docworkflow').data('kendoGrid').dataSource.add({ ActionName: nameEntry , ActionType: typeEntry });
Спасибо за публикацию. с setDataSource я могу вставлять данные со стороны клиента. Как передать эти данные в метод контроллера? В моем сценарии у меня нет данных, поступающих из бэкэнда. Пользователь будет вводить данные из браузера, и они должны быть сохранены в бэкенде.
Посмотрите на конец моего первого ответа. Либо создайте форму на своей странице, либо через jquery добавьте в форму скрытые входные данные. Затем опубликуйте форму или опубликуйте ее через jquery/ajax. Раздел, в котором есть блок кода с надписью «Пример кода JQuery sudo». Вашему контроллеру просто нужно ожидать параметр с именем «userData», который будет List<YourType>
columns.Bound(e => e.ActionName).ClientTemplate("#= ActionName #<input type='hidden' name='Actions[#= index(data)#].ActionName' value='#= ActionName#' />"); Я наконец-то заработал так. Я не уверен, что именно он делает.
Эдди, большое спасибо за помощь. Как и в моем предыдущем комментарии, у меня это сработало одним способом. Теперь я пробую ваш путь, чтобы лучше понять эту вещь.
Да, ваш способ должен работать. Однако вы должны быть уверены, что используете методы кендо для изменения данных таким образом, чтобы пользовательский интерфейс обновлялся. С формой, окружающей вашу сетку, вы сможете публиковать данные при отправке формы. Мой код на самом деле не так уж отличается. Это в основном то же самое, за исключением того, что мой будет запускаться только непосредственно перед публикацией для создания скрытых полей, в то время как ваш способ стирает из DOM и добавляет их обратно каждый раз, когда данные изменяются.
Спасибо... Я пытаюсь разобрать всю эту информацию. Ценить это