Подтвердить что ты не робот

Отправить форму с сеткой 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. Любое направление было бы высоко оценено. Это продолжалось.

4b9b3361

Ответ 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));
            }
        })

Это может быть легко проанализировано в контроллере "Разделение на запятые и двоеточия".