在不同的控制器和视图中使用完全相同的代码时,数据表会引发错误

时间:2014-09-03 21:05:55

标签: c# jquery asp.net-mvc-5 jquery-datatables

好的,现在已经很晚了,我可能会错过一些愚蠢明显的东西,但是因为我接受的错误(下面)完全没有意义。

我目前在两个独立的控制器中有以下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控制器的索引视图中工作,数据表使用下面的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控制器中删除了自定义处理程序以排除任何问题。我已经浏览了上述错误,虽然有很多关于这个主题的信息,但似乎没有解释是什么原因导致这个问题,在一个场景中它完全正常,但在另一个它没有“T

编辑:

如果它对任何人都有帮助,我甚至无法手动输入URL来获取http://localhost:50210/Ordering/GetProducts的JSON结果(我还没有使用实时服务器,所以我不能指向实时URL)。它呈现页面然后抛出一个合适的东西,而不是下载。

1 个答案:

答案 0 :(得分:0)

所以,我今晚回到代码中尝试解决错误。自定义授权属性已从控制器中删除,有时甚至将其保留,我甚至检查了我做的AuthoriseCore覆盖,以查看是否有阻止请求的内容,但无论我做什么都没有用。

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

我不想知道为什么会出现这个问题以及导致问题的原因,但是我很高兴问题已经解决了。感谢评论中的帮助和建议。

修改

就在不久之前,我在对Route Config文件进行一些更改时找到了问题的原因。回到我在原始问题中做出的评论,这是非常明显的,并且删除控制器工作的原因是因为原始控制器在2个不同的名称下有2个RouteConfigs,而新的控制器没有设置在RouteConfig当时​​。因此,控制器变得困惑,不知道要看哪一个,这意味着它投入了一个合适的东西并决定它不想工作。