jqgrid loadError не запускается - PullRequest
       29

jqgrid loadError не запускается

0 голосов
/ 02 сентября 2018

Я использую 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 никогда не срабатывает, поэтому мое сообщение об ошибке выглядит ужасно:

enter image description here

Вот заголовок ответа (отметим, что это 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;

Что мне делать? Спасибо.

...