我正在使用free-jqgrid v 4.15.5,MVC 5,嵌入式编辑,Firefox和Chrome。
我今天的问题是我需要实现服务器端验证。如果验证消息显示得很好,这将非常有用。我已经从先前的问题中剪切并粘贴了一些solutions。我的问题是loadError
中的jqgrid
替代项没有触发。我很乐意将其完全排除在外,因为我了解loadError
随jqgrid
一起提供,并且应该自己工作。好像不开枪loadError
还是不开枪?
我的jqgrid
中一定有问题,或者我未发布的某些javascript代码正在干扰正确的操作。可能HandleJsonException
属性过滤器未达到预期的效果?有什么想法吗?
我使用此过滤器并用其装饰我的JSON方法saveGrid
:
public class HandleJsonExceptionAttribute : System.Web.Mvc.ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
if (filterContext.HttpContext.Request.IsAjaxRequest() && filterContext.Exception != null)
{
filterContext.HttpContext.Response.StatusCode =
(int)System.Net.HttpStatusCode.InternalServerError;
var exInfo = new List<ExceptionInformation>();
for (Exception ex = filterContext.Exception; ex != null; ex = ex.InnerException)
{
PropertyInfo propertyInfo = ex.GetType().GetProperty("ErrorCode");
exInfo.Add(new ExceptionInformation()
{
Message = ex.Message,
Source = "Validation",
StackTrace = ""
});
}
filterContext.Result = new JsonResult() { Data = exInfo };
filterContext.ExceptionHandled = true;
}
}
}
我在saveGrid
控制器中以此触发了上面的代码:
throw new HttpException(400, messagetext);
我的jqgrid:
$("#jqGrid").jqGrid({
url: '/ajax/doSearch?viewid=&rowid=&isChild=false',
mtype: 'POST',
autowidth :true,
datatype: 'json',
guiStyle: "bootstrap",
editable: true,
afterShowForm: function () {
alert('Please select row');
return;
},
editurl: "/Ajax/saveGrid?subGridViewId=&parentID=",
loadonce: true,
cmTemplate: { autoResizable: true },
autoresizeOnLoad: true,
autoResizing: { compact: false, resetWidthOrg: true },
shrinktofit: true,
colModel: ColModel1,
loadError: function (jqXHR, textStatus, errorThrown) {
alert('hi');
// remove error div if exist
$('#' + this.id + '_err').remove();
// insert div with the error description before the grid
myGrid.closest('div.ui-jqgrid').before(
'<div id="' + this.id + '_err" style="max-width:' + this.style.width +
';"><div class="ui-state-error ui-corner-all" style="padding:0.7em;float:left;"><span class="ui-icon ui-icon-alert" style="float:left; margin-right: .3em;"></span><span style="clear:left">' +
decodeErrorMessage(jqXHR, textStatus, errorThrown) + '</span></div><div style="clear:left"/></div>')
},
loadComplete: function () {
alert('load complete');
// remove error div if exist
$('#' + this.id + '_err').remove();
},
caption: label,
height: "auto",
postData: {
viewid: GlobalViewid,
__RequestVerificationToken: __RequestVerificationToken
},
rowNum: 50,
rowList: [16, 50, 100],
subGrid: showSubGrid,
// javascript function that will take care of showing the child grid
subGridRowExpanded: showChildGrid,
subGridOptions: {
// expand all rows on load
expandOnLoad: false
},
actionsNavOptions: {
printicon: "glyphicon-print",
printtitle: "Print form",
custom: [
{
action: "print", onClick: function (options) {
// window.open('Report/ReportViewer?reportname=reportf_' + GlobalViewid + '&rowid=' + options.rowid + '&reporttype=form' , 'windowName', 'width=1000, height=700, left=24, top=24, scrollbars, resizable');
window.open('Report/ReportViewer?reportname=reportf_' + GlobalViewid + '&rowid=' + options.rowid + '&reporttype=form');
},
hidden: noPrintButton,
}
]
},
pager: "#jqGridPager"
//toppager: true
});
问题:
loadError
永远不会触发,所以我的错误消息是丑陋的弹出窗口:
这是响应头(注意是500,而不是我期望的400)
HTTP / 1.1 500内部服务器错误 缓存控制:无缓存,无存储 语法:无缓存 内容类型:application / json;字符集= utf-8 过期:-1 服务器:Microsoft-IIS / 10.0 X源文件:=?UTF-8?B? X-Powered-by:ASP.NET 日期:2018年9月2日,星期日,08:50:48 GMT 内容长度:59
这是响应: [{“ Message”:“ hello”,“ Source”:“ Validation”,“ StackTrace”:“”}]
我尝试更改HandleJsonException属性过滤器,因此它现在返回状态HTTP 400,但这无济于事。
filterContext.HttpContext.Response.StatusCode = (int)System.Net.HttpStatusCode.BadRequest;
我该怎么办?谢谢。