【问题标题】:Kendo: Handling Errors in Ajax Data RequestsKendo:处理 Ajax 数据请求中的错误
【发布时间】:2012-11-19 04:08:04
【问题描述】:

MVC4 中使用 Kendo UI 我有一个 Grid,它使 Ajax 调用将数据返回到控制器:

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

如何使用此调用通知页面出现错误?

【问题讨论】:

    标签: asp.net-mvc kendo-ui kendo-grid


    【解决方案1】:

    如果您需要显示来自服务器的错误消息,则可以通过返回仅设置了 Errors 属性的 DataSourceResult 对象来实现:

    return this.Json(new DataSourceResult
                {
                    Errors = "my custom error"
                });
    

    然后使用它在客户端上获取它(由.Events(events => events.Error("onError")) 行引用):

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

    【讨论】:

    • 我建议您使用 ModelState catch (Exception exc) { ModelState.AddModelError(string.Empty, exc.Message); return Json(new UserModel[0].ToDataSourceResult(request, ModelState)); } 在这种情况下,您将能够对更新操作验证和删除\读取操作使用相同的错误处理程序。 (因为在验证期间错误是数组 [] [] 而不是字符串)
    • 如果您按照@Sergey 的建议使用ModelState,您必须在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]; }
    • @Drew Delano。我在“DataSourceResult”中找不到任何名为“Errors”的属性。请指教。
    • 我的 JavaScript 方法function onError(e) { if (e.errors) { var message = "Errors:\n"; $.each(e.errors, function (key, value) { if ('errors' in value) { $.each(value.errors, function() { message += this + "\n"; }); } }); alert(message); } }
    • @SachinTrivedi 从 MVC 控制器到“DataSourceResult”的“错误”:ModelState.AddModelError("Error", "Error occurred!");return Json(onDemandApps.ToDataSourceResult(request, ModelState)); 这是最简单的方法。
    【解决方案2】:

    找到了,Kendo 支持它,只需在 DataSource 中添加一个 Event 即可调用 JS 函数。就是这样。

      .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>
    

    【讨论】:

    • 这里有什么遗漏吗?第一位看起来不像是有效的 JS,而且 JS 的大小写也是错误的。
    • 不,顶部是使用 Razor 格式的标准剑道。这一切都有意义且有效。
    • 你仍然需要一种机制来将错误数据从控制器传递到网格,所以不幸的是还有更多。
    【解决方案3】:

    稍微扩展 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.");
        }
    
    }
    

    【讨论】:

    • 同理,获取导致数据源读取的特定剑道网格,例如已排序,您可以使用$(e.sender.options.table.context).data("kendoGrid")
    • @Rhumborl 我的 e.sender.options.table 为空。知道为什么会这样吗?
    【解决方案4】:

    尝试引发异常并检查它是否提示警报消息。

    对于剑道网格,有可能对您有帮助的错误事件。

    http://docs.kendoui.com/documentation/getting-started/using-kendo-with/aspnet-mvc/migration/widgets/grid

    我们使用了 Telerik mvc 网格,如果绑定时出现任何错误,它会自动显示警报消息。

    http://www.telerik.com/community/forums/aspnet-mvc/grid/exception-handling.aspx

    http://www.telerik.com/community/forums/aspnet-mvc/grid/how-to-do-error-handling-in-gridaction-methods.aspx

    【讨论】:

    • 不幸的是,Kendo Grid 在通过 Ajax 访问数据时似乎没有处理控制器中的异常。我想知道是否有一条我们可以发回的消息,尽管它可能会收到
    • 如果您使用 JQuery ajax 请求手动绑定网格,请尝试从控制器的“oneexception”方法发送错误消息。
    • 最后两个链接仅供高级访问。
    【解决方案5】:

    对于读取数据,您不应向 ModelState 添加豁免并返回它,就像您为创建更新和删除请求所做的那样,而是将错误添加到数据源对象并使用相同的 jquery onerror 事件处理它。

     public virtual JsonResult Read_Tasks([DataSourceRequest] DataSourceRequest request) 
        {
            try
            {
                return Json(ListAll().ToDataSourceResult(request));
            }
            catch (Exception ex)
            {
                string exmptionText = ex.Message;
    
                ModelState.AddModelError(string.Empty, exmptionText); //This will not work 
                Logger.Error(exmptionText + ex.StackTrace);
    
                return this.Json(new DataSourceResult
                {
                    Errors = new
                    {
                        a = new { errors = new[] { exmptionText } }
                    }
                });
            }
        }
    
    function error_handler(e)
        {
            if (e.errors)
            {
            var message = "Errors:\n";
            $.each(e.errors, function (key, value) {
                if ('errors' in value) {
                    $.each(value.errors, function () {
                        message += this + "\n";
                    });
                }
    
     alert(message );
            });
    
         
        }
    

    【讨论】:

      【解决方案6】:

      怎么样

      throw new HttpResponseException(HttpStatusCode.BadRequest);
      

      【讨论】:

        猜你喜欢
        • 2014-01-16
        • 1970-01-01
        • 2014-01-12
        • 1970-01-01
        • 2017-07-26
        • 2012-06-14
        • 1970-01-01
        • 1970-01-01
        • 2015-01-31
        相关资源
        最近更新 更多