如何在Kendo网格中处理客户端错误处理

时间:2015-02-04 09:18:30

标签: javascript asp.net-mvc-4 asp.net-web-api kendo-ui kendo-grid

我需要一些帮助。我想得到服务器端错误并显示到kendo网格。如何使用客户端JavaScript。我会在kendo网格中找到错误。如何找到它..如果我正在调用服务,那么服务器中的某些错误就像(Bad request或500)那样。如何获取在剑道网格中出现此错误。可以使用javascript Kendo网格在客户端获取错误。

3 个答案:

答案 0 :(得分:0)

我假设您使用Ajax将数据加载到Kendo网格中。需要在网格中定义错误事件处理。

@ DontVoteMeDown的答案适用于JavaScript。这可能是你问题的正确答案。

Razor实现更直接,可以实现如下所示。

@(Html.Kendo().Grid<KendoGridAjaxEditing.Models.ProductViewModel>()
      .Name("grid")
      .Columns(columns =>
      {
          columns.Bound(product => product.ProductID).Width(100);
          columns.Bound(product => product.ProductName);
          columns.Bound(product => product.UnitsInStock).Width(250);
          columns.Command(commands =>
          {
              commands.Edit();
              commands.Destroy();
          }).Title("Commands").Width(200);
      })
      .ToolBar(toolbar => toolbar.Create())
      .Editable(editable => editable.Mode(GridEditMode.InLine))
      .DataSource(dataSource =>
          dataSource.Ajax()
            .Events(events => events.Error("grid_error")) // Handle the "error" event
            .Model(model =>
            {
                model.Id(product => product.ProductID);
                model.Field(product => product.ProductID).Editable(false);
            })
            .Create(create => create.Action("Products_Create", "Home"))
            .Read(read => read.Action("Products_Read", "Home"))
            .Update(update => update.Action("Products_Update", "Home"))
            .Destroy(destroy => destroy.Action("Products_Destroy", "Home"))
      )
      .Pageable()
)
<script>
function grid_error(e) {
    if (e.errors) {
        var message = "There are some errors:\n";
        // Create a message containing all errors.
        $.each(e.errors, function (key, value) {
            if ('errors' in value) {
                $.each(value.errors, function () {
                    message += this + "\n";
                });
            }
        });
        // Display the message
        alert(message);
        // Cancel the changes
        var grid = $("#grid").data("kendoGrid");
        grid.cancelChanges();
    }
}
</script>

http://docs.telerik.com/kendo-ui/aspnet-mvc/helpers/grid/ajax-editing

答案 1 :(得分:0)

http://docs.telerik.com/kendo-ui/api/javascript/data/datasource#events-error

只需监听错误事件并调整服务器响应,以便在抛出错误时返回Json对象。

在ASP.NET MVC项目中,我在我的基本控制器中使用了一个如下所示的方法:

    protected JsonResult JsonError(ModelStateDictionary modelState)
    {
        if (modelState == null) new ArgumentNullException();
        if (modelState.IsValid) new ArgumentException();

        Response.Clear();
        Response.ContentEncoding = Encoding.UTF8;
        Response.HeaderEncoding = Encoding.UTF8;
        Response.TrySkipIisCustomErrors = true;
        Response.StatusCode = 400;

        return Json(String.Join("\n", modelState.SelectMany(state => state.Value.Errors, (state, error) => error.ErrorMessage)));
    }

它需要一些适应你的odata服务,但这应该让你开始。使用400 StatusCode返回错误消息的重要部分(其他代码可能有效)。

答案 2 :(得分:0)

为可能近期陷入困境的任何人写出此答案。此问题基本上包括三个部分:-

  1. 如果代码在服务器上中断,返回的操作方法是什么。这是我为Kendo ui返回的内容,以确认服务器上存在错误:-

    return Json(new { error = String.Format("Error message.") });

请注意,如果未从服务器以正确的格式返回JSON,则kendo将不会识别出代码已损坏。

  1. 您如何处理前端错误。如果您使用的是new kendo.data.DataSource,则可以使用error属性,并将其分配给以下函数:-

    var cloudStore = new kendo.data.DataSource({
    
    //other properties here
    
    //error property below
    error: function (e) {
    
        //since an error has occured, we are below removing the object we added to the grid
        $("#cloudGrid").each(function (item) {
            var grid = $(this).data("kendoGrid");
            if (e.sender === grid.dataSource) {
                grid.cancelChanges();
            }
        });
    
        //opening a popup to show the error message
        alert(e.errors);
        }
    )};
    
  2. 即使在后端实际更新对象之前,Kendo也会在前端更新网格,因此,如果服务器上发生错误,我们将相应地更新网格。为此,请注意上面的代码并查看each循环。那是网格被还原到其上一阶段的地方。