Telerik Kendo Grid (MVC) 更新后刷新

Posted

技术标签:

【中文标题】Telerik Kendo Grid (MVC) 更新后刷新【英文标题】:Refresh after update Telerik Kendo Grid (MVC) 【发布时间】:2014-07-31 05:44:42 【问题描述】:

我有一个带有一些环境数据的剑道网格。网格的字段之一是“isDefault”,它接收 1 或 0(对于真或假)。在数据库中,我有一个触发器,当某些记录设置为 isDefault = 1 时,任何其他记录都会更新为 isDefault = 0,以确保只有一个默认环境。

Kendo 网格工作正常,它绑定数据并更新记录就好了,但更新后,网格没有刷新所有记录,如果有,比如说,isDefault =1 的记录 1,我更新记录 4 到 isDefault = 1 触发触发器并将所有其他记录更新为 isDefault = 0 但网格仍然显示记录 1 和 isDefault = 1 现在记录 4 和 isDefault = 1

这是我认为的代码:

html.Kendo().Grid<Models.Environment>()
                   .Name("environmentGrid")
                   .Sortable()
                   .ToolBar(tb =>  tb.Create())
                   .Editable(editable => editable.Mode(GridEditMode.PopUp))
                   .Columns(cols =>
                   
                       cols.Bound(c => c.Name).Width(150).Sortable(true);
                       cols.Bound(c => c.ConnectionString).Width(150).Sortable(true);
                       cols.Bound(c => c.Template).Width(150).Sortable(true);
                       cols.Bound(c => c.isDefault).Width(150).Sortable(true);
                       cols.Bound(c => c.StatusID).Width(150).Sortable(true);
                       cols.Command(command =>  command.Edit();).Width(60);
                   )
                   .DataSource(ds => ds
                       .Ajax()
                       .Model(model => 
                        
                           model.Id(m => m.EnvironmentID);
                       )
                       .Read(r => r.Action("GetEnvironments", "Admin"))
                       .Update(update => update.Action("UpdateEnvironments", "Admin"))
                       .Create(update => update.Action("UpdateEnvironments", "Admin"))                           
                   )

这是我控制器上的代码:

[AcceptVerbs(HttpVerbs.Post)]
    public ActionResult UpdateEnvironments([DataSourceRequest] DataSourceRequest dsRequest, Environment environment)
    
        environment.ModifiedBy = userName;

        if (environment != null && ModelState.IsValid)
        
            if (environment.EnvironmentID != 0)
            
                var toUpdate = xgr.EnviromentRepository.ListAll().FirstOrDefault(p => p.EnvironmentID == environment.EnvironmentID);
                TryUpdateModel(toUpdate);
            
            xgr.EnviromentRepository.Save(environment);
        
        return Json(ModelState.ToDataSourceResult());
    

提前感谢您的回答。

【问题讨论】:

【参考方案1】:

我终于让它工作了。添加了一个事件处理程序:

Html.Kendo().Grid<Models.Environment>()
                   .Name("environmentGrid")
                   .Sortable()
                   .ToolBar(tb =>  tb.Create())
                   .Editable(editable => editable.Mode(GridEditMode.PopUp))
                   .Columns(cols =>
                   
                       cols.Bound(c => c.Name).Width(150).Sortable(true);
                       cols.Bound(c => c.ConnectionString).Width(150).Sortable(true);
                       cols.Bound(c => c.Template).Width(150).Sortable(true);
                       cols.Bound(c => c.isDefault).Width(150).Sortable(true);
                       cols.Bound(c => c.StatusID).Width(150).Sortable(true);
                       cols.Command(command =>  command.Edit();).Width(60);
                   )
                   .DataSource(ds => ds
                       .Ajax()
                       .Model(model => 
                        
                           model.Id(m => m.EnvironmentID);
                       )
                       .Events(events =>
                              
                                    events.RequestEnd("onRequestEnd"); //I've added this
                              )
                           .Read(r => r.Action("GetEnvironments", "Admin"))
                           .Update(update => update.Action("UpdateEnvironments", "Admin"))
                           .Create(update => update.Action("UpdateEnvironments", "Admin"))                           
                       )

还有一个 javascript 函数:

function onRequestEnd(e) 
        if (e.type == "update") 
            $("#environmentGrid").data("kendoGrid").dataSource.read();
        
    

我还需要将 EnvironmentRepository 上的 ListAll() 方法修改为:

 public List<XML_Environment> ListAll()
    
        _dataContext = new XMLGenEntitiesDataContext(); //I've to add this line. so the context is instantiated every time I call the ListAll Method.
        return _dataContext.XML_Environments.OrderBy<XML_Environment, string>(c => c.EnvironmentName).ToList<XML_Environment>();
    

【讨论】:

【参考方案2】:

您返回了错误的对象。我真的不知道您是如何获取数据的,因为您没有发布GET 控制器,所以我将尝试猜测它。更新数据后,您需要将它们发送回网格。 ModelState 不包含您想要的数据。试试这个:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult UpdateEnvironments([DataSourceRequest] DataSourceRequest dsRequest, Environment environment)

    environment.ModifiedBy = userName;

    var updatedRecords = null;//1

    if (environment != null && ModelState.IsValid)
    
        if (environment.EnvironmentID != 0)
        
            var toUpdate = xgr.EnviromentRepository.ListAll().FirstOrDefault(p => p.EnvironmentID == environment.EnvironmentID);
            TryUpdateModel(toUpdate);

            updatedRecords = xgr.EnviromentRepository.ListAll();//2 -- you might need to add "ToList()", depending on your implementation
        
        xgr.EnviromentRepository.Save(environment);
    
    return Json(updatedRecords.ToDataSourceResult(request, ModelState));//3

有关完整示例,请参阅this link。

【讨论】:

感谢您的回答,我会尝试并回复我的结果。 您好,在最后一行(评论 3)中,我认为您的意思是 updatedRecords.ToDataSourceResult 而不是 ModelState.ToDataSourceResult。无论哪种方式都行不通。我也尝试了您发布的相同示例,但没有。

以上是关于Telerik Kendo Grid (MVC) 更新后刷新的主要内容,如果未能解决你的问题,请参考以下文章

Telerik Kendo MVC Grid 子模板从父模板获取默认值

Telerik Kendo UI ASP.NET MVC Grid - 已保存数据项的事件处理

Kendo Grid MVC - 服务器导出 Excel 日期时间字段(自定义格式)

Telerik Kendo Grid 重新绑定问题

Telerik Kendo MVC 文本框多行模式

在Telerik Kendo UI MVC网格中添加“mailto:”链接