【问题标题】:Datatables throws error when using the exact same code in different controllers and views在不同的控制器和视图中使用完全相同的代码时,Datatables 会引发错误
【发布时间】: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


【解决方案1】:

所以,我今晚回到代码尝试解决错误。自定义的授权属性已从控制器中删除,甚至有时仍处于打开状态,我什至检查了我所做的 AuthoriseCore 覆盖,看看是否有什么东西阻止了请求,但是无论我做什么都行不通。

最后,作为最后的努力,我删除了整个控制器、视图以及与控制器关联的所有文件。添加了一个使用不同名称的新控制器,设置了一个新视图和运行数据表所需的 JQUERY,并且由于某种原因(我不知道为什么)一切都开始按预期工作。

我讨厌不知道为什么会导致此问题以及导致此问题的原因,但我很高兴问题已得到解决。感谢 cmets 中的帮助和建议。

编辑

所以不久前,我在对 Route Config 文件进行一些更改时找到了问题的原因。回到我在原始问题中所做的评论,这非常明显,删除控制器起作用的原因是因为原始控制器在 2 个单独的名称下有 2 个 RouteConfig,而新控制器尚未在 RouteConfig 中设置当时。因此,控制器变得混乱,不知道该看哪一个,这意味着它发出了嘶嘶声并决定它不想工作。

【讨论】:

  • 很高兴听到这个消息,对不起,我没有提供更多帮助。
  • 感谢您的帮助,这不是问题。老实说,我只是在几秒钟前修改一些代码时偶然发现了问题的路由原因。我马上更新答案。
猜你喜欢
  • 1970-01-01
  • 2012-12-14
  • 1970-01-01
  • 2012-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-08
相关资源
最近更新 更多