Asp.net mvc 剑道:处理Ajax数据请求中的错误
在MVC4中使用KendoUI,我有一个网格,使得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)); } 如何使用此调用通知页面出
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为空。知道原因吗?我建议您使用ModelStatecatch(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);