Asp.net mvc 剑道:处理Ajax数据请求中的错误

Asp.net mvc 剑道:处理Ajax数据请求中的错误,asp.net-mvc,kendo-ui,kendo-grid,Asp.net Mvc,Kendo Ui,Kendo Grid,在MVC4中使用KendoUI,我有一个网格,使得Ajax调用数据返回控制器: public ActionResult SearchUser_Read([DataSourceRequest]DataSourceRequest request) { var data = CreateAnExcaptionHere(); return Json(data.ToDataSourceResult(request)); } 如何使用此调用通知页面出

MVC4中使用KendoUI,我有一个网格,使得Ajax调用数据返回控制器:

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

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

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

对于剑道网格,有一个错误事件可能会对您有所帮助

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


找到了它,Kendo只需向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>
.DataSource(DataSource=>DataSource
.Ajax()
.Events(Events=>Events.Error(“onError”))
.Read(Read=>Read.Action(“SearchUser\u Read”,“Search”).Data(“parentModel”))
)
功能onError(e,状态){
警报(“发生服务器错误!”);
}

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

return this.Json(new DataSourceResult
            {
                Errors = "my custom error"
            });
并使用此命令(由
.Events(Events=>Events.Error(“onError”))
行引用)在客户机上拾取它:


稍微扩展Drew的回答:我们通常希望在出现错误时也回滚剑道网格中的更改。否则,如果在从网格中删除项时抛出错误,例如,即使抛出错误并显示消息,该项仍将显示为已删除

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

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.");
    }

}
怎么样

throw new HttpResponseException(HttpStatusCode.BadRequest);

不幸的是,在通过Ajax访问数据时,剑道网格似乎不处理控制器中的异常。我想知道我们是否可以发送回一条消息,尽管它可能会在您使用JQuery ajax请求手动绑定网格时收到,请尝试从控制器的“OneException”方法发送错误消息。最后两个链接仅为高级访问。这里缺少什么吗?第一位看起来不像是有效的JS,JS的大小写也是错误的。不,顶部是使用Razor格式的标准剑道。这一切都是有意义的,并且是有效的。您仍然需要一种机制来将错误数据从控制器传递到网格,因此不幸的是,还有更多。同样,要获得导致数据源读取的特定剑道网格,例如,已排序的剑道网格,您可以使用
$(e.sender.options.table.context).data(“kendoGrid”)
@Rhumborl my e.sender.options.table为空。知道原因吗?我建议您使用ModelState
catch(Exception exc){ModelState.addmodeleror(string.Empty,exc.Message);返回Json(新用户模型[0].ToDataSourceResult(请求,模型状态));}
在这种情况下,您将能够使用相同的错误处理程序进行更新操作验证和删除\读取操作。(因为在验证过程中,ERORR是数组[],而不是字符串)如果使用@Sergey建议的ModelState,则必须在
onError(e,status)
方法中使用
e.errors[“”].errors
来访问错误值。e.errors对象中的字符串是您提供给
ModelState.addmodeleror
的任何键值。然后可以循环显示所有错误,如下所示:
var errors=e.errors[“”].errors;var错误消息;对于(var i=0;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”});}});警报(消息);}}
@SachinTrivedi将“错误”从MVC控制器转换为“DataSourceResult:
ModelState.addmodeleror(“错误”,“发生错误!”)
返回Json(onDemandApps.ToDataSourceResult(请求,模型状态))这是最简单的方法。
throw new HttpResponseException(HttpStatusCode.BadRequest);