为啥我的 KendoGrid “更新”参数在控制器中始终为空?

Posted

技术标签:

【中文标题】为啥我的 KendoGrid “更新”参数在控制器中始终为空?【英文标题】: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 它没有帮助。也没有控制台错误。 【参考方案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】:
    在.DataSource() 中使用.Batch(true) 方法考虑相关的操作方法

    在剑道网格内使用以下代码创建工具栏

        .ToolBar(toolbar =>
        
            toolbar.Create();
            toolbar.Save();
        )
    

    网格的编辑模式必须是 incell 才能添加多个条目或像下面的示例代码那样在批处理模式下

       .Editable(ed => ed.Mode(GridEditMode.InCell).TemplateName("EditDocket").Window(w => w.Title("Docket").Name("editWindow").Width(377).Height(200).Scrollable(true)))
    

    使用下面的示例代码获取模型详细信息绑定到控制器的操作方法中的视图

    [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());
    
    
    

    唯一需要的是 [Bind(Prefix = "models")]IEnumerable uDockets) 作为相关操作方法的参数

【讨论】:

以上是关于为啥我的 KendoGrid “更新”参数在控制器中始终为空?的主要内容,如果未能解决你的问题,请参考以下文章

为啥更新操作没有发布任何数据?

如何自动更新剑道网格?

为啥`data(“kendogrid”)`未定义?

kendo ui grid 动态控制某属性

使用 AJAX 绑定时创建/更新后具有 IEnumerable 属性的 Kendo Grid 模型未正确更新

为啥当我返回时我的主视图控制器不会更新?