删除记录时未找到任何元素

时间:2016-02-09 19:16:08

标签: javascript jquery asp.net-mvc firefox jqgrid

JqGrid 4.6。

一切正常。唯一的问题是当我打开Firefox调试器并转到控制台时。如果我删除了一条记录(点击垃圾桶图标,然后弹出删除对话框,点击删除按钮,刷新页面等),调试器会发出警告。

  

找不到元素

可能的脚本是:

$(gridSelector).jqGrid('navGrid', pagerSelector,
            {
                //navbar options
                edit: true,
                editicon: 'ace-icon fa fa-pencil blue',
                add: true,
                addicon: 'ace-icon fa fa-plus-circle purple',
                del: true,
                delicon: 'ace-icon fa fa-trash-o red',
                search: true,
                searchicon: 'ace-icon fa fa-search orange',
                refresh: true,
                refreshicon: 'ace-icon fa fa-refresh green',
                view: true,
                viewicon: 'ace-icon fa fa-search-plus grey',
                beforeRefresh: function () {
                    grid.jqGrid('setGridParam', { datatype: 'json' }).trigger('reloadGrid');
                }
            },

            {
                //delete record form
                closeAfterDelete: true,
                recreateForm: true,
                mtype: 'DELETE',
                onclickSubmit: function (params, postdata) {
                    params.url = API_URL + 'DeleteVendor';
                },
                beforeShowForm: function (e) {
                    var form = $(e[0]);
                    if (form.data('styled')) return false;

                    form.closest('.ui-jqdialog').find('.ui-jqdialog-titlebar').wrapInner('<div class="widget-header" />');
                    styleDeleteForm(form);

                    form.data('styled', true);
                    return true;
                }
            }

另外

function styleDeleteForm(form) {
            var buttons = form.next().find('.EditButton .fm-button');
            buttons.addClass('btn btn-sm btn-white btn-round').find('[class*="-icon"]').hide(); //ui-icon, s-icon
            buttons.eq(0).addClass('btn-danger').prepend('<i class="ace-icon fa fa-trash-o"></i>');
            buttons.eq(1).addClass('btn-default').prepend('<i class="ace-icon fa fa-times"></i>');
        }

虽然错误没有影响我的结果。我无法找到警告。我想删除它。

修改

我在谷歌浏览器中尝试过它。好像没关系。也许这是Firefox中的错误?

1 个答案:

答案 0 :(得分:2)

创建the demo project之后,可用于重现&#34;问题&#34;我可以检查和描述它。

要重现问题,需要启动MVC应用程序并使用Firefox作为前端。应该启动集成调试器(通过 Ctrl + Shift + S 或菜单&#34;工具&#34; /&#34; Web开发人员&#34; /&#34;调试器&#34;)并检查浏览器控制台窗口。该窗口包含许多警告,这些警告对于Firefox是可疑的,但绝对正确的操作和警告是绝对不需要的。删除任何一行后,将看到如

的消息

enter image description here

我完全检查了问题并且它确实是错误警告,因为错误解释了REST操作的HTTP流量。 ASP.NET MVC的DELETE方法,其void作为返回值(如public void DeleteProduct(int id))生成HTTP响应,如

HTTP/1.1 204 No Content
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Server: Microsoft-IIS/10.0
X-AspNet-Version: 4.0.30319
X-SourceFiles: =?UTF-8?B?QzpcVXNlcnNcT2xlZ1xEb3dubG9hZHNcUHJvZHVjdFN0b3JlXFByb2R1Y3RTdG9yZVxhcGlccHJvZHVjdHNcNA==?=
X-Powered-By: ASP.NET
Date: Fri, 12 Feb 2016 09:23:51 GMT

Firefox的错误:显示消息&#34;找不到元素&#34;对于没有正文的所有HTTP响应。因此,如果状态代码为204(无内容)或状态代码为200(确定),但正文为空(存在HTTP标头Content-Length: 0),则Firefox会怀疑找不到REST资源,它显示&#34;警告&#34;使用文字&#34;找不到元素&#34;。

如果您不想看到该消息,则必须在DELETE响应正文中返回一些数据。例如

public HttpResponseMessage DeleteProduct(int id)
{
    bool isDeleted = _repository.Remove(id);
    if (!isDeleted) {
        throw new HttpResponseException(HttpStatusCode.NotFound);
    }
    return Request.CreateResponse(HttpStatusCode.OK, "OK!");
}

产生类似

的响应
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Type: application/json; charset=utf-8
Expires: -1
Server: Microsoft-IIS/10.0
X-AspNet-Version: 4.0.30319
X-SourceFiles: =?UTF-8?B?QzpcVXNlcnNcT2xlZ1xEb3dubG9hZHNcUHJvZHVjdFN0b3JlXFByb2R1Y3RTdG9yZVxhcGlccHJvZHVjdHNcNg==?=
X-Powered-By: ASP.NET
Date: Fri, 12 Feb 2016 09:05:19 GMT
Content-Length: 5

"OK!"

我个人认为应该更好地忽略&#34;警告&#34; Firefox并保留public HttpResponseMessage DeleteProduct(int id)。我仍然建议您更新用于

的存储库
interface IProductRepository
{
    IEnumerable<Product> GetAll();
    Product Get(int id);
    Product Add(Product item);
    bool Remove(int id);
    bool Update(Product item);
}

其中Remove将布尔值作为返回类型。实施可以是

public bool Remove(int id)
{
    return _products.RemoveAll(p => p.Id == id) > 0;
}

和MVC代码

public void DeleteProduct(int id)
{
    _repository.Remove(id);
}

将固定为

public void DeleteProduct(int id)
{
    bool isDeleted = _repository.Remove(id);
    if (!isDeleted)
    {
        throw new HttpResponseException(HttpStatusCode.NotFound);
    }
}

我想强调的是,以上所有问题都是纯ASP.NET MVC问题或Firefox的问题,它与免费的jqGrid或jqGrid没有直接关系。

您可以下载修改后的项目hereProductsController.cs文件包含DeleteProduct的评论版,在Firefox中不会产生任何警告。您可以通过将虚拟文本"OK!"更改为空字符串""或其他一些测试来使用代码。 Firefox的bug很老(它的原始接缝是the Bug 521301)。