alt text http://img3.imageshack.us/img3/1488/advancedsearch.png建議在ASP.NET
建立一個動態的「高級搜索」控制我建立在ASP.NET應用程序的「高級搜索」界面。我不需要爲我寫這個東西,但我被困在關於動態控件和ViewState的特定問題上。我想知道如何解決這個問題。這裏是我的情況:
主料:
- 一個維修組表示實體,字段和搜索API對象,它可以處理構建搜索,生成SQL,並返回結果。所有這一切都照顧好了。
- ASP.NET 3.5
所需界面功能性:
(1)在初始頁面加載,接口獲取預先配置的搜索對象與一組SearchCriterion對象。它結合他們到一組控件
一些搜索項目是簡單的,像(見上圖):
場(的DropDownList)|運算符(DropDownList)|對於某些字段類型的值(文本框)
搜索標準控制已存儲的重要信息視圖狀態,如:
場(的DropDownList)|運算符(DropDownList)|值(DropDownList)其中「值」下拉列表由數據庫查詢填充。
某些字段查找到其它實體,這導致場選擇的鏈,如:
字段(DropDownList的)場(DropDownList的)|運算符(DropDownList)|值
(2)用戶修改由所述搜索:
- 添加和通過點擊各個按鈕通過改變字段,操作員或值
- 配置現有標準卸下的搜索條件。對字段或操作員的更改將要求控件通過更改可用操作符,將「值」輸入控件更改爲其他類型,或者如果選擇/取消選擇查找類型字段,從「字段」部分添加/刪除DropDownLists, 。
(3)最後,用戶點擊「搜索」查看他們的結果。
問題:
正如你可能已經知道,如果你回答這個問題,動態添加控件的頁面消失回發。我已經創建了一個UserControl來操縱控件集合,並完整地完成上面的步驟(1),您可以在附加圖像中看到它。 (很明顯,我現在不關心風格。)
但是在Postback上,控件都沒了,我的Search API對象也沒有了。如果我可以讓動態生成的控件集合在ViewState中很好地運行,我可以檢查回發控件,重建搜索對象,然後整齊地處理控件事件。
可能的解決方案
我可以使搜索對象序列化並將其存儲在視圖狀態中。然後在頁面加載時,我可以抓取它並在頁面加載時重新構建控件集合。不過,我不確定這是否能夠很好地與控件引發事件以及包含數據庫數據的下拉列表的視圖狀態發生了什麼變化 - 我可以恢復它嗎?我非常不希望在每次回發時重新查詢數據庫。
我可以爲這種事情開發一個自定義服務器控件(see this link)......但這對我來說是一個新話題,並且涉及一些學習,另外我不完全確定一個自定義服務器控件是否會更好地使用非固定控制集合。有人知道嗎?
我在想我可以使用數據綁定控件來完成此操作 - 例如我可以將我的標準集合綁定到具有固定控件集合的中繼器(可以隱藏未使用的「值」控件,使用「字段」下拉列表的內部中繼器)。那麼所有的信息將保持在ViewState中...對嗎?
任何新的想法將不勝感激。
感謝您的幫助。 b.Fandango
這是一篇很棒的文章,我試圖構建幾乎完全一樣的搜索頁面。你介意分享你的初始工作的任何例子,即創建「一組代表實體,字段和搜索的可用API對象,它們處理構建搜索,生成SQL並返回結果。」如果你有任何鏈接或信息要共享,這將是非常有益的,只是擔心,如果已經有libs /框架在做這種事情,我不想重新發明輪子。謝謝,偉大的職位! – russds 2013-07-18 17:28:20
russds,我在一箇中等規模的企業軟件包上工作,該軟件包有自己的元數據(實體和字段)和搜索實現。我無法與您分享我的僱主的任何源代碼,儘管我確信他們不會介意我是否寫過關於系統該部分的設計和實施。不過,我認爲有很多「業務對象」基類庫,可以爲您提供這些類型的功能。我會看看我能爲你找到什麼,但我也建議你一邊快速的谷歌。 – 2013-07-18 20:48:53
謝謝巴里。我做了一些谷歌搜索,但不完全是谷歌,我嘗試過諸如「動態搜索UI」和「asp.net高級搜索」之類的東西,但沒有具體的結果。你的描述正是我正在尋找的內容,我會搜索什麼樣的術語?謝謝! – russds 2013-07-25 20:18:39