繁体   English   中英

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

[英]Table not sorting properly in specific column (MVC)

快速问题:

我使用了一些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,但这在DB中不是这种情况,并且在中间,而不是在其余int / decs之前/之后。

我唯一能想到的就是关闭填充我的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使此代码看起来超级垃圾来解决,如果有人愿意加入此建议,我们很乐意接受)。

无论如何,由于上面图片中显示的值是实际“发票”表中值的正确总和,因此这会正确填充。 同样,“总成本”上的单个值对于42k高于11k(在排序使用原始值而不是总和的情况下)。 这两个值已在控制器中与其他值组合在一起,但是一旦将这些值传递给VM,就感觉不相关。

我会寻找更多答案,而且我确定错误是在控制器中的某个地方,但我根本不知道要寻找什么。 除了“总成本”之外,对于所有列,该排序在所有其他表中均能很好地工作,甚至在同一页的该表中也能很好地工作。 任何帮助,将不胜感激。

非常感谢!

您是否绝对可以确定此脚本在其他表中正确地对数值进行了排序? 您确实提到只要适当地“标记”了所有内容,但这意味着什么? 您是否能够以某种方式指定特定的表格数据单元仅是数字?

至于控制器中有什么问题,我怀疑情况就是这样。 控制器确实向视图提供数据,但排序完全取决于javascript。

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

现在开始讨论,这里您的脚本从指定的表格单元中检索值:

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

这是比较之一:

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

我不认为检索innerHTML并将其更改为小写字母能够分辨出数字和字符串之间的区别。 我可能是错的,但我确实做了一些简单的测试,因此可以很好地应对字母排序。 但是,例如使用数字,它认为1002小于14。

您可以尝试添加更多条件检查,以检查x和y变量是数字还是字符串,然后将它们保存到新的数字变量中,然后进行排序。

或者,您可以尝试使用其他排序解决方案: DataTables 尽管是基于jQuery的,但它是一个非常漂亮的软件包。 (不以任何方式隶属于他们,我就是我自己)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM