表未在特定列(MVC)中正确排序

时间:2017-12-13 10:24:48

标签: javascript asp.net-mvc sorting html-table controller

快速问题:

我已经使用了一些我发现的javascript来点击他们的标题对我的所有表格进行排序,这在大多数情况下绝对正常。正确标记时,字符串,整数等都会在整个页面中正确排序。

            function sortTable(n) {

        var table, rows, switching, i, x, y, shouldSwitch, dir, switchcount = 0; //declares necessary variables

        table = document.getElementById("toSortTable"); 

        switching = true; 

        dir = "asc"; 

        while (switching) { 

            switching = false; 
            rows = table.getElementsByTagName("tr"); 

            for (i = 1; i < (rows.length - 1) ; i++) { 

                shouldSwitch = false; 

                x = rows[i].getElementsByTagName("td")[n]; 
                y = rows[i + 1].getElementsByTagName("td")[n]; 

                if (dir == "asc") { 

                    if (x.innerHTML.toLowerCase() > y.innerHTML.toLowerCase()) { //compares the 2 values
                        shouldSwitch = true; /
                        break;
                    }

                } else if (dir == "desc") {
                    if (x.innerHTML.toLowerCase() < y.innerHTML.toLowerCase()) { 
                        shouldSwitch = true; 
                        break;
                    }
                }
            }
            if (shouldSwitch) { 
                rows[i].parentNode.insertBefore(rows[i + 1], rows[i]);
                switching = true;
                switchcount++; 
            } else {
                if (switchcount == 0 && dir == "asc") {
                    dir = "desc";
                    switching = true;
                }
            }
        }
    }

如上所述,这个JS似乎适用于我指定的大多数页面,但是在一个表中它给了我一些问题。在我的一张桌子上,排序只是不能提供正确的订单。

https://imgur.com/a/7EZ5y(不知道如何嵌入此内容)

该表格已在两个图像中按总计费成本点击(即已分类)。我读到当其中一个值包含空格时,可能会发生拙劣的排序,因此该字段被识别为字符串而不是dec / int,但这不是数据库中的情况,以及显示在数据库中的奇怪条目中间而不是之前/之后的其余内容/秒。

我唯一可以想象的是关闭我的控制器来填充我的VM:

            public ActionResult Index()
    {
        List<InvoiceVM> listOfInvoices = new List<InvoiceVM>();
        var iNVOICES = db.INVOICES.Include(i => i.INVOICES_TO_CREDIT);



        foreach (var entry in iNVOICES)
        {
            bool check = false;
            foreach (var checkDupe in listOfInvoices)
            {
                if (checkDupe.invoiceNo == entry.INV_NO)
                {
                    check = true;
                }
            }
            if (check == true)
            {
                check = false;
            }
            else
            {
                InvoiceVM toAdd = new InvoiceVM();
                toAdd.account = entry.ACCOUNT;
                toAdd.subDate = entry.SUB_DATE;
                toAdd.cc = entry.CC;
                toAdd.reference = entry.SOLUTION_OWNER;
                toAdd.invoiceNo = entry.INV_NO;
                toAdd.project = entry.PROJECT_ID;
                toAdd.ikeaProject = entry.SLTN_NAME;
                toAdd.invoiceNo = entry.INV_NO;
                toAdd.autoNo = Convert.ToInt32(entry.AUTO_ID);

                foreach (var invoice in iNVOICES)
                {
                    if (invoice.INV_NO == toAdd.invoiceNo)
                    {
                        toAdd.totalCost += Convert.ToInt32(invoice.EMP_TOTAL_COST);
                    }
                }

                listOfInvoices.Add(toAdd);

            }

        }
        return View(listOfInvoices);

    }

(我知道这可能是通过一些超级简单的GroupBy + Sum来解决的,这使得这些代码看起来非常垃圾,如果有人愿意把它放进去的话,很乐意接受这个建议。)

无论如何,这会正确填充,因为上面图片中显示的值是实际发票表中正确的值总和。此外,&#34;总成本&#34;对于42k,比11k更高(如果排序使用原始值而不是总计值)。这两个值都已在控制器中与其他值组合在一起,但是一旦将值传递给VM,这并不感觉相关。

我会寻找更多的答案,我确定错误在我控制器的某个地方,但我不知道该寻找什么。排序在所有其他表中完美地工作,甚至在同一页面上的表中完美地工作,对于所有列而言总成本为1。任何帮助将不胜感激。

非常感谢!

1 个答案:

答案 0 :(得分:0)

您是否绝对确定此脚本会在其他表中正确排序数值?你确实提到过,只要一切都被标记为#34;适当的,但这是什么意思?你能以某种方式指定特定的表格数据单元格只是数字吗?

至于控制器出错的地方,我怀疑是这种情况。控制器确实向视图提供数据,但排序完全取决于javascript。

当然可以在控制器中进行排序,您可以查看示例here

现在开始营业了,这里你的脚本从指定的表格单元格中检索值:

x = rows[i].getElementsByTagName("td")[n]; 
y = rows[i + 1].getElementsByTagName("td")[n]; 

这是比较之一:

x.innerHTML.toLowerCase() > y.innerHTML.toLowerCase()

我不认为检索innerHTML并将其更改为小写是能够区分数字和字符串。我可能是错的,但我做了一些简单的测试,并且它很好地应对字母排序。然而,对于数字,例如,它认为1002小于14。

如果x和y变量为numbers or strings,你可以尝试添加一些条件检查,然后将它们保存到新的数值变量然后进行排序。

或者您可以尝试其他排序解决方案:DataTables。它是一个非常漂亮的包,虽然基于jQuery。 (与他们无任何关系,我自己就是这样)。