Я использую free-jqgrid v 4.15.5., MVC 5, встроенное редактирование, Firefox и Chrome.
Моя проблема сегодня заключается в том, что мне нужно реализовать проверку на стороне сервера. Это будет очень здорово, если сообщение о проверке будет хорошо отображаться. Я вырезал и вставил несколько решений из предыдущих вопросов. Моя проблема в том, что переопределение 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);
my 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 Внутренняя ошибка сервера
Cache-Control: без кеша, без хранилища
Прагма: без кеша
Тип контента: приложение / JSON; кодировка = UTF-8
Истекает: -1
Сервер: Microsoft-IIS / 10.0
X-SourceFiles: =? UTF-8? B? QzpcVXNlcnNcVXNlclxzb3VyY2VccmVwb3NcYXBwQnVpbGRlcldpdGhSZXBvcnRzXGFzcG5ldDQtc2FtcmhHXVXHXFX
X-Powered-By: ASP.NET
Дата: вс, 02 сентября 2018 08:50:48 GMT
Длина контента: 59
А вот и ответ:
[{ "Сообщение": "привет", "Источник": "Проверка", "StackTrace": ""}]
Я попытался изменить фильтр атрибута HandleJsonException, чтобы он теперь возвращал статус HTTP 400, но это не помогло.
filterContext.HttpContext.Response.StatusCode =
(INT) System.Net.HttpStatusCode.BadRequest;
Что мне делать? Спасибо.