jqgrid loadError无法触发

时间:2018-09-02 07:46:37

标签: c# validation jqgrid free-jqgrid

我正在使用free-jqgrid v 4.15.5,MVC 5,嵌入式编辑,Firefox和Chrome。

我今天的问题是我需要实现服务器端验证。如果验证消息显示得很好,这将非常有用。我已经从先前的问题中剪切并粘贴了一些solutions。我的问题是loadError中的jqgrid替代项没有触发。我很乐意将其完全排除在外,因为我了解loadErrorjqgrid一起提供,并且应该自己工作。好像不开枪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永远不会触发,所以我的错误消息是丑陋的弹出窗口:

enter image description here

这是响应头(注意是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;

我该怎么办?谢谢。

0 个答案:

没有答案