我的任务是筛选我遇到过的最糟糕的经典意大利面条。
脚本按顺序运行一系列记录集,一次获取1条记录。在构建记录时,它接受id并将其传递给下一个循环,该循环获取数据,并将id传递给下一个循环。然后它以这种方式继续并构建一个无序列表,随着时间的推移踢出所需的html。
到目前为止,我的努力是:
有一个类通过sqldatareaders传递数据并将这些数据输出到嵌套的中继器(由于无法循环并获取id而失败)
使用所有必需数据填充数据表,然后使用datatable.select将其过滤掉。
有4个数据接口循环并构建ul arraylists(我 无法让id匹配起来)
请您建议最好的方法
答案 0 :(得分:2)
是的当然可以在ASP.NET中重写 - 请注意,我说重写了,而不仅仅是重构,没有保存该代码(这是可以的它做了什么,但事情与ASP.NET不同。
老实说,我甚至没有检查代码,这伤害了我的眼睛。很多。但是一般来说,你可以使用一个漂亮的SQLConnection对象和一个SQLCommand,调用一个存储过程并获得一个很好的SqlDataReader,其中包含可以构建DataTable或IEnumerable数据对象列表的数据。然后,在UI中有一个转发器类型控件(ListView,GridView等),只需将数据表或列表绑定到该控件即可呈现结果。
使用ListView,您可以为呈现的每个数据项指定模板。对于GridView,您可以指定列(或列模板)以及列应绑定到的每个数据项的属性。
检索数据时,可以将其保留为DataTable,或将其转换为其他类似数据对象的列表(或数组)。只要您的列表/数组实现IEnumerable,您就应该能够将列表分配给上述转发器控件的ItemsSource属性,并且它将发挥其魔力。
您甚至不必使用SQLCommand和DataTable对象 - 您甚至可以使用Linq to SQL并将结果直接绑定到转发器控件。
这只是对如何做到这一点的高级概述,有几种不同的方式。完成后,您的代码将比传统的ASP代码更清晰,更易于维护。
编辑:您的主要问题是如何生成有序列表,这是当前代码使用其为详细信息项提供ID的嵌套循环所做的事情。
我建议你退后一步,重新考虑一下sql。事实上,扔掉当前的sql,使用你今天拥有的工具效率极低。它只需十分之一秒,只需一次数据库调用即可返回一个平面数据表。你的第一直觉可能是“但我不想回复太多数据!” - 放松,如果正确完成,即使返回数千个数据行也可以是1秒以下的操作。你也可以通过将参数传递给存储过程来限制返回的数据,或者将它们附加到你构造的动态sql语句中(尽管我非常痛苦地提到动态sql,我认为它很邪恶,但是有些人仍然使用它 - 我不会推荐它,除非它是你唯一的选择)。总结我的意思,你的数据如何从数据库返回以及它在屏幕上的外观是两回事,不要让一个引导另一个。您可以从数据库中获取数据,然后在将其呈现给UI之前进行操作。
如果您仍想将数据显示为有序列表,则使用ListView,为每个数据项定义模板,然后您可以使用LINQ对您喜欢的数据进行分组或过滤(数据项模板可以包含任何内容)您喜欢的HTML或ASP.NET控件,并为数据列表中的每个数据项呈现该模板。或者,您可以使用GridView,然后使用GridView的分组功能为您完成工作 - 只需指定要分组的列,GridView负责渲染。