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中的错误?
答案 0 :(得分:2)
创建the demo project之后,可用于重现&#34;问题&#34;我可以检查和描述它。
要重现问题,需要启动MVC应用程序并使用Firefox作为前端。应该启动集成调试器(通过 Ctrl + Shift + S 或菜单&#34;工具&#34; /&#34; Web开发人员&#34; /&#34;调试器&#34;)并检查浏览器控制台窗口。该窗口包含许多警告,这些警告对于Firefox是可疑的,但绝对正确的操作和警告是绝对不需要的。删除任何一行后,将看到如
的消息我完全检查了问题并且它确实是错误警告,因为错误解释了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没有直接关系。
您可以下载修改后的项目here。 ProductsController.cs
文件包含DeleteProduct
的评论版,在Firefox中不会产生任何警告。您可以通过将虚拟文本"OK!"
更改为空字符串""
或其他一些测试来使用代码。 Firefox的bug很老(它的原始接缝是the Bug 521301)。