【问题标题】:Why are my KendoGrid "update" parameters always null in the controller?为什么我的 KendoGrid “更新”参数在控制器中始终为空?
【发布时间】:2014-05-02 13:21:59
【问题描述】:

我的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。像这样:

为什么是null

【问题讨论】:

  • 浏览器有控制台错误吗?如果没有,请尝试将公共 void 函数中的 arg 名称从 models 更改为 result
  • 它没有帮助。也没有控制台错误。

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


【解决方案1】:

在你的parameterMap中:function()

而不是使用

return JSON.stringify(data);

使用

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

在这里,您的数据被序列化并附加到一个名称 models 现在这个名称 models 在您的操作中用作参数名称

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:
      1. 在.DataSource() 中使用.Batch(true) 方法考虑相关的操作方法
      2. 在剑道网格内使用以下代码创建工具栏

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

           .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) 作为相关操作方法的参数

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-18
        • 1970-01-01
        • 2014-04-28
        • 2016-05-12
        • 1970-01-01
        相关资源
        最近更新 更多