为什么我的KendoGrid"更新"参数在控制器中始终为空?

时间:2014-03-24 22:40:34

标签: c# javascript kendo-ui telerik kendo-grid

我的Index.cshtml文件中包含以下代码:

var dataSource = new kendo.data.DataSource({
    type: "json",
    transport: {
        read: {
            url: '@Url.Action("ReadTeachers", "EducationPortal")',
            dataType: "json"
        },
        update: {
            url: '@Url.Action("UpdateTeachers", "EducationPortal")',
            type: "POST"
        },
        parameterMap: function (data, operation) {
            if (operation != "read"){ 
                var result = {};

                for (var i = 0; i < data.models.length; i++) {
                    var teacher = data.models[i];
                    for (var member in teacher) {
                        result["teacher[" + i + "]." + member] = teacher[member];
                    }
                }

                return result;
            } else {
                return JSON.stringify(data);
            }
        }
    },
    batch: true,
    schema: {
        model: {
            id: "TeacherId",
            fields: {
                TeacherId: { type: "number" },
                FullName: { type: "string" },
                IsHeadmaster: { type: "boolean" }
            }
        }
    }
});

$("#teachers").kendoGrid({
    dataSource: dataSource,
    toolbar: ["create", "save"],
    columns: [
        { field: "FullName", title: "Teacher" },
        { field: "IsHeadmaster", title: "Is a Headmaster?", width: "120px" },
        { command: ["destroy"], title: "&nbsp;", width: "85px" }],
    editable: true
});

这是一个带有“批量”编辑功能的标准KendoGrid。编辑和网格本身都工作正常,但后端没有。当“更新”请求通过时,它将转到此控制器方法:

public void UpdateTeachers(string models)
{
    // this method will have real code later
    Console.Write(models);
}

当我在此处放置断点时,Visual Studio会将models显示为null。像这样:

enter image description here

为什么是null

3 个答案:

答案 0 :(得分:2)

在你的parameterMap:function()

而不是使用

return JSON.stringify(data);

使用

return { models: kendo.stringify(data) };

此处您的数据已序列化并附加到名称模型,现在此名称模型在您的操作中用作参数名称

答案 1 :(得分:1)

您需要在参数映射函数内的控制器中命名参数。此外,您似乎正在尝试发送整个数据对象而不是模型。我会在参数映射函数中尝试这个:

parameterMap: function (data, operation) {
        if (operation === "update" && data.models){ 
            return {models: kendo.stringify(data.models) };
        }
    }

答案 2 :(得分:-1)

  1. 在相关操作方法<。li>中使用.DataSource()内的.Batch(true)方法
  2. 在kendo网格内使用以下代码创建工具栏

        .ToolBar(toolbar =>
        {
            toolbar.Create();
            toolbar.Save();
        })
    
  3. 网格的编辑模式必须是单元格才能添加多个条目或批处理模式,如下面的示例代码

       .Editable(ed => ed.Mode(GridEditMode.InCell).TemplateName("EditDocket").Window(w => w.Title("Docket").Name("editWindow").Width(377).Height(200).Scrollable(true)))
    
  4. 使用以下示例代码获取模型详细信息绑定到控制器操作方法中的视图

    [HttpPost]
    public ActionResult AppEditDocketCreate([DataSourceRequest] DataSourceRequest  request, [Bind(Prefix = "models")]IEnumerable<UDocket> uDockets)
    {
        try
        {
            if (uDockets != null && ModelState.IsValid)
            {
                using (IVSourceEntities db = new IVSourceEntities())
                {
    
                    TBL_Docket tblDocket = new TBL_Docket();
                    foreach (var uDocket in uDockets)
                    {
    
                        tblDocket.DocketName = uDocket.DocketName;
    
                        tblDocket.CreatedDate = System.DateTime.Now;
    
                        db.TBL_Docket.Add(tblDocket);
                        db.SaveChanges(); 
                    }
    
                }
            }
        }
    
    
       catch (DbEntityValidationException e)
        {
    
        }
    
        return Json(ModelState.ToDataSourceResult());
    
    }
    
  5. 只需要[Bind(Prefix =“models”)] IEnumerable uDockets)作为相关行动方法的参数