【发布时间】:2014-10-28 12:07:33
【问题描述】:
好的,现在已经很晚了,我可能遗漏了一些明显很愚蠢的东西,但就目前而言,我收到的错误(如下)完全没有意义。
我目前在两个单独的控制器中有以下 C# 代码,基本上其中一个 JsonResults 返回的结果会有所不同,但现在我复制了代码以排除潜在问题。
public JsonResult GetProducts(DataTableParameters param)
{
var products = _productsRepository.GetAll().ToList();
var totalRecords = products.Count();
var filteredUsers = totalRecords;
if (!string.IsNullOrEmpty(param.sSearch))
{
products =
products.Where(w => w.ProductName.Contains(param.sSearch) ||
w.Description.Contains(param.sSearch)).ToList();
filteredUsers = products.Count();
}
var productList = products.Select(product => new[] {
Url.Action("Details", "ProductAdminstration", new {id = product.ProductId}),
product.Description,
product.Price.ToString(),
string.Empty,
product.ProductName,
Url.Action("Edit", "ProductAdminstration", new { id = product.ProductId }),
Url.Action("Delete", "ProductAdminstration", new { id = product.ProductId })
});
var parms = new
{
sEcho = param.sEcho,
iTotalRecords = totalRecords,
iTotalDisplayRecords = filteredUsers,
aaData = productList
};
return Json(parms, JsonRequestBehavior.AllowGet);
}
上面的代码在 ProductAdminstration 控制器的 Index 视图中工作,数据表使用下面的 JQuery 按预期呈现数据,并且显然是在 HTML 中呈现具有适当 ID 的表。
oTable = $("#products").dataTable({
"oLanguage": {
"sEmptyTable": "No results available",
"sSearch": "Search",
"sLengthMenu": "Show _MENU_",
"sProcessing": "Processing" },
"bServerSide": true,
"sAjaxSource": "@Url.Action("GetProducts", "ProductAdminstration")",
"bProcessing": true,
"aoColumns": [
//RENDER COLUMNS HERE
]}).fnSetFilteringDelay(500);
但是,如果我将上述代码从 ProductAdminstration(JQuery 和 JsonResult)复制到另一个控制器(Ordering)并将 sAjaxSource 更改为指向新控制器,则会引发以下错误:
0x800a139e - JavaScript runtime error: DataTables warning: table id=products - Invalid
JSON response.
请记住,我唯一更改的是 sAjaxSource 中的控制器名称,如果我将控制器名称更改回 ProductAdminstration 而不是 Ordering 一切正常。
两个控制器都要求对用户进行身份验证,但是,我已从 Ordering 控制器中删除了我的自定义处理程序以排除任何问题。我已经查看了上述错误,虽然有很多关于这个主题的信息,但它似乎并不能解释导致这个问题的原因,在一种情况下它工作得很好,但在另一种情况下却没有不。
编辑:
如果它对任何人有帮助,我什至无法手动输入 URL 以从 http://localhost:50210/Ordering/GetProducts 获取 JSON 结果(我还没有使用实时服务器,因此我无法将您指向实时 URL)。它呈现页面然后抛出一个嘶嘶声,而不是进行下载。
【问题讨论】:
-
您可以尝试从错误控制器复制 JSON 响应并通过 JSON validator 运行它吗?
-
不幸的是,服务器逻辑中的 JsonResult 永远不会被命中。自从错误开始之前,我的方法中就有断点,所以我可以随时测试它,错误控制器中永远不会到达断点。
-
您是否使用 Fiddler 查看发送和接收的内容?每当我遇到这样的情况时,我都会使用 Fiddler 来看看有什么不同。此外,它还是一个很棒的工具。
-
Fiddler 报告状态码为 200 的所有内容,包括
GET /Ordering/GetProducts?sEcho=1&iColumns=4&sColumns=%2C%2C ....的事件,但没有明显问题。但是,控制器方法没有被触及。两个控制器的代码完全相同,JQuery 仅使用新的控制器路径进行了修改,这是唯一的更改。如果代码不查看我当前所在的控制器,为什么代码会起作用是没有意义的。 -
在其他条件相同的情况下,您提到的唯一区别是“我已从 Ordering 控制器中删除了我的自定义处理程序”。如果您将其从
ProductAdminstration中删除会怎样?
标签: c# jquery asp.net-mvc-5 jquery-datatables