快速问题:
我已经使用了一些我发现的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。任何帮助将不胜感激。
非常感谢!
答案 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。 (与他们无任何关系,我自己就是这样)。