Отправить форму с сеткой Kendo MVC и другими элементами
Я пытаюсь получить форму, содержащую сетку MVK телекина и другие элементы для отправки.
- Модель View содержит три строковых поля и коллекцию
IEnumerable
.
- Сетка привязана к серверу. Я не добавляю никаких элементов или не удаляю никаких элементов из списка с помощью сетки, но сетка содержит флажок, сопоставленный с булевым столбцом в элементах списка.
Когда я отправляю эту форму, три элемента строки возвращаются в методе post, но список всегда равен нулю.
Вот модель данных:
public class Parent
{
public string Field1{get;set;}
public string Field2{get;set;}
public string Comments {get;set;}
public IEnumerable<ChildItems> Children{get;set;}
}
Public class ChildItems
{
public string ChildField1{get;set;}
public string ChildField2{get;set;}
public boolean Include{get;set;}
}
Вот мой вид:
@{
ViewBag.Title = "Index";
}
@model GridInForm.Models.Parent
@using(Html.BeginForm("Save", "Home"))
{
<fieldset>
<legend>Editing Parent</legend>
@Html.LabelFor(parent => parent.Field1)
@Html.EditorFor(parent => parent.Field1)
@Html.LabelFor(parent => parent.Field2)
@Html.EditorFor(parent => parent.Field2)
@Html.LabelFor(parent => parent.Comments)
@Html.EditorFor(parent => parent.Comments)
@(Html.Kendo().Grid(Model.Children)
.Name("Children")
.ToolBar(tools => tools.Create().Text("Add new Children"))
.Editable(editable => editable.Mode(GridEditMode.PopUp)
.CreateAt(GridInsertRowPosition.Bottom))
.Columns(columns =>
{
columns.Bound(p => p.ChildField1).ClientTemplate("#= ChildField1 #" +
"<input type='hidden' name='ChildField1[#= index(data)#].ChildField1'
value='#= Name #' />"
);
columns.Bound(p => p.ChildField2).Hidden().ClientTemplate("#= ChildField1
#" +
"<input type='hidden' name='ChildField1[#= index(data)#].ChildField1'
value='#= ChildField1 #' />"
);
columns.Command(command =>
{
// command.Destroy();
command.Edit();
}
).Width(100);
})
.DataSource(dataSource => dataSource.Server().Create("Create",
"Home").Read("Index", "Home").Update("Update", "Home")
.Model(model =>
{
model.Id(p => p.ChildField1);
model.Field(p => p.ChildField1).Editable(false);
})
//.ServerOperation(true)
)
)
</fieldset>
<input type="submit" value="Save" />
}
<script>
function index(dataItem) {
alert("bindind");
var data = $("#Products").data("kendoGrid").dataSource.data();
return data.indexOf(dataItem);
}
</script>
Когда я передаю форму, я возвращаю родительские элементы обратно в модель просмотра, но поля Inumerable из сетки всегда имеют значение null.
Разве это не способ сделать это, и если да, то каков способ скомпоновать что-то вроде этого. У меня была эта проблема на предыдущих версиях telerik, и я вижу, что это то же самое в интерфейсе Kendo. Любое направление было бы высоко оценено. Это продолжалось.
Ответы
Ответ 1
У меня точно такой сценарий отлично работает в моем проекте. Вот моя декларация сетки...
@(Html.Kendo().Grid(Model.ChildLines)
.Name("RequestLinesGrid")
.Editable(editable => editable.Mode(Kendo.Mvc.UI.GridEditMode.InCell))
.Columns(columns =>
{
columns.Bound(p => p.ItemCode).ClientTemplate("#= ItemCode #" +
"<input type='hidden' name='MyLines[#= index(data)#].ItemCode' value='#= ItemCode #' />"
);
columns.Bound(p => p.Description).ClientTemplate("#= Description #" +
"<input type='hidden' name='MyLines[#= index(data)#].Description' value='#= Description #' />"
);
columns.Bound(p => p.UoM).ClientTemplate("#= UoM #" +
"<input type='hidden' name='MyLines[#= index(data)#].UoM' value='#= UoM #' />"
);
columns.Bound(p => p.QtyCC).ClientTemplate("#= QtyCC #" +
"<input type='hidden' name='MyLines[#= index(data)#].QtyCC' value='#= QtyCC #' />"
);
columns.Bound(p => p.QtyEmployee).ClientTemplate("#= QtyEmployee #" +
"<input type='hidden' name='MyLines[#= index(data)#].QtyEmployee' value='#= QtyEmployee #' />"
);
columns.Bound(p => p.ItemListLineID).Hidden(true).ClientTemplate("#= ItemListLineID #" +
"<input type='hidden' name='MyLines[#= index(data)#].ItemListLineID' value='#= ItemListLineID #' />"
);
columns.Bound(p => p.ItemListCode).Hidden(true).ClientTemplate("#= ItemListCode #" +
"<input type='hidden' name='MyLines[#= index(data)#].ItemListCode' value='#= ItemListCode #' />"
);
columns.Command(command =>
{
command.Destroy();
}).Width(200);
})
.DataSource(dataSource => dataSource.Ajax()
.Model(m =>
{
m.Id(p => p.ItemCode);
m.Field(p => p.ItemCode).Editable(false);
m.Field(p => p.Description).Editable(false);
m.Field(p => p.UoM).Editable(false);
m.Field(p => p.QtyCC).Editable(true);
m.Field(p => p.QtyEmployee).Editable(true);
m.Field(p => p.ItemListLineID).Editable(false);
m.Field(p => p.ItemListCode).Editable(false);
})
.Batch(true)
.ServerOperation(false)
// these are dummy action methods that don't really exist.
.Update("upd", "upd")
.Destroy("del", "del")
.Create("cre", "cre")
)
.Navigatable()
)
Здесь функция "index":
function index(dataItem) {
var data = $("#RequestLinesGrid").data("kendoGrid").dataSource.data();
return data.indexOf(dataItem);
}
Ответ 2
Итак, вот часть решения вашего вопроса. Я расширил источник данных kendo, поэтому вы можете вызвать эту функцию и получить все обновленные, удаленные, созданные элементы. Просто превратите его в json и отправьте его обратно с остальными полями вашей формы. Сейчас у меня это работает. Думаю, я бы поделился.
kendo.data.DataSource.prototype.GetUnsavedData = function () {
var that = this,
idx,
length,
created = [],
updated = [],
destroyed = that._destroyed,
allRows = [],
data = that._flatData(that._data);
for (idx = 0, length = data.length; idx < length; idx++) {
if (data[idx].isNew()) {
created.push(data[idx]);
} else if (data[idx].dirty) {
updated.push(data[idx]);
}
}
allRows = created.concat(updated).concat(destroyed);
var allRowsJSON = JSON.stringify(allRows);
return allRowsJSON;
}
Ответ 3
Я был вдохновлен codebeastie и @user1878526, чтобы создать следующую гибридную идею - просто вернув сетку в виде списка строк в контроллер сохраняет действие:
Контроллер:
Function Save(ThisForum As myModel, gridData As List(Of String)) As ActionResult
Вид:
$("#myForm").submit(function (event) {
var grid = $("#myGrid").data("kendoGrid");
var data = grid.dataSource.view();
var input;
for (var i = 0; i < data.length; i++) {
var s = JSON.stringify(data[i]).replace(/["']/g, "");
input = $("<input>", { type: 'hidden', name: 'data[' + i + ']', value: s });
$(this).append($(input));
}
})
Это может быть легко проанализировано в контроллере "Разделение на запятые и двоеточия".