2010-06-17 62 views
1

我一直負責篩選我遇到過的最糟糕的經典asp意大利麪條。是否有可能將此asp轉換爲asp.net?

該腳本按順序運行一系列記錄集,一次獲取1條記錄。在創建記錄時,它會將該ID傳遞給下一個獲取數據的循環,並將該ID傳遞給下一個循環。然後它以這種方式繼續並構建一個無序列表,在需要的時候踢出所需的html。

這裏是我的努力迄今:

  1. 有一類通過sqldatareaders和輸出這些嵌套中繼器提供數據(這個失敗,原因是不能夠循環並獲得ID)

  2. 使用所有必需的數據填充數據表,然後使用datatable.select將其過濾掉。

  3. 有4周的DataReader循環和建設UL的ArrayList(我 不可能得到的ID來匹配)

請你可以建議最好的方法

+0

放心,我見過遠遠更糟的經典asp代碼;-) – fretje 2010-06-17 10:24:10

回答

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負責渲染。

+0

我的主要問題是代碼沿着前面的MenuNid傳遞到下一個記錄集,然後總共4個記錄集產生1條記錄。我不能想到如何在asp.net中做到這一點! +1的眼睛疲勞。我一直盯着這個代碼幾天! – Phil 2010-06-17 10:56:24

+0

@Phil - 看我的編輯。 – slugster 2010-06-17 11:20:30

+0

感謝slugster – Phil 2010-06-17 12:19:26

相關問題