Kendo:处理Ajax数据请求中的错误

Ian*_*ink 31 asp.net-mvc kendo-ui kendo-grid

MVC4中使用Kendo UI 我有一个Grid,它使Ajax调用数据回到Controller中:

    public ActionResult SearchUser_Read([DataSourceRequest]DataSourceRequest request)
    {
        var data = CreateAnExcaptionHere();
        return Json(data.ToDataSourceResult(request));
    }
Run Code Online (Sandbox Code Playgroud)

如何使用此调用通知页面存在错误?

Dre*_*ano 44

如果需要从服务器显示错误消息,则可以通过返回仅设置了Errors属性的DataSourceResult对象来执行此操作:

return this.Json(new DataSourceResult
            {
                Errors = "my custom error"
            });
Run Code Online (Sandbox Code Playgroud)

并使用此功能在客户端上进行选择(由该.Events(events => events.Error("onError"))行引用):

function onError(e, status) {
    if (e.status == "customerror") {
        alert(e.errors);
    }
    else {
        alert("Generic server error.");
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我建议你使用ModelState`catch(Exception exc){ModelState.AddModelError(string.Empty,exc.Message); return Json(new UserModel [0] .ToDataSourceResult(request,ModelState)); 在这种情况下,您将能够使用相同的错误处理程序进行更新操作验证和删除\读取操作.(因为在验证期间Erorrs是array [] []而不是字符串) (9认同)
  • 如果您使用ModelState作为@Sergey建议您必须在`onError(e,status)`方法中使用`e.errors [""].errors`来访问错误值.e.errors对象中的字符串是您提供给`ModelState.AddModelError`的任何键值.然后你可以循环并显示所有错误,如:`var errors = e.errors [""].errors; var errorMessage; for(var i = 0; i <errors.length; i ++){errorMessage = errors [i]; }` (3认同)

Ian*_*ink 25

找到它,Kendo通过向要调用的JS函数的DataSource添加一个Event来支持它.而已.

  .DataSource(dataSource => dataSource
      .Ajax()
      .Events(events => events.Error("onError"))
      .Read(read => read.Action("SearchUser_Read", "Search").Data("parentModel"))
  )

<script> 
    function onError(e, status) {
          alert("A server error has occurred!");
}
</script>
Run Code Online (Sandbox Code Playgroud)

  • 不,顶部是使用Razor格式的标准Kendo.这一切都有道理和有效. (3认同)

Mat*_*att 11

只是稍微扩展Drew的答案:我们通常希望在发生错误时回滚Kendo Grid中的更改.否则,如果在从网格中删除项目时抛出错误,例如,即使抛出错误并显示消息,它仍将显示为已删除.

此函数还取消使用引发错误的数据源的任何网格中的更改:

function onError(e, status) {

    // Cancel changes on any grids on the page that are using this data source
    $('.k-grid').each(function (item) {
        var grid = $(this).data("kendoGrid");
        if (e.sender === grid.dataSource) {
            grid.cancelChanges();
        }
    });

    if (e.status == "customerror") {
        alert(e.errors);
    }
    else {
        alert("Generic server error.");
    }

}
Run Code Online (Sandbox Code Playgroud)