2010-01-17 36 views
2

我確信這已被回答,但我找不到它......也許是因爲這些術語被用於許多不同的問題......無論如何。建立在回發上的動態控件(asp.net)

是如何存儲關於在init事件回發等構建動態控制信息的最佳方式......

例如採取經典的「調查問卷」的情景...... question.aspx?ID = 1

  1. 從查詢字符串獲取ID
  2. 負載從那裏過的問題和動態建立控制, 或動態添加的每個問題 如何以往任何時候都多 問題等
  3. 頁面回用戶控件(用戶按下提交我猜!)在init事件
  4. ... 應該在哪裏你有已經存儲的ID來 重新創建問題控件?

事情,我已經試過至今/念頭:

  • 我最初存儲的值在 視圖狀態,因爲它是相關的 頁面,但視圖狀態值不 提供頁面初始化(或是否?)
  • 隱藏變量,然後訪問表單集合中的值
  • 會話 - 我不想使用會話,似乎有問題,例如如果用戶查看兩份問卷怎麼辦?
  • 再次查詢字符串?但這似乎太容易被改變,動態控制只是沒有意義...
  • 在控制自己?例如無論問卷編號如何,只需簡單地將問題編號刪除即可?假設控制ID將採用某種格式,如controlQ#例如控制Q1,控制Q2。這意味着每個問題ID必須是唯一的

任何幫助/指導等非常感謝!

回答

1

查詢字符串在回發期間仍然可用,因此您可以從此處獲取ID。

如果你擔心用戶操縱查詢字符串參數,那麼也許你應該添加一些額外的參數,這將讓你回發時驗證查詢字符串的正確性。舉個簡單的例子,你可以添加ID參數和當前會話ID的MD5哈希值,並重新創建/回發時比較該校驗和。

0

嘗試在頁面OnLoad中創建/加載usercontrols。 如果你想加載一個usercontrol內的其他usercontrols使用OnInit事件。

使用視圖狀態來保存在回發期間需要重新實例化usercontrols的信息。要將回發數據映射到控制樹,您必須確保具有相同的控制樹。在映射後,你可以改變你的控制樹(加載一些其他控件,例如)

contols-id:是的,你必須給他們唯一的ID,否則它將無法工作。如果您將問題存儲在數據庫中,那麼爲此使用數據庫主鍵應該沒有任何問題,所以請將其命名爲問題1,問題2(控件)

+0

如果我在onload事件創建它們,它聽起來,我必須手動恢復,然後在那裏,如果我在init事件創建他們,他們會自動恢復回傳值吧? – davidsleeps 2010-01-17 21:23:56

+0

我們還在使用usercontrols嗎? 您不必手動恢復回發值。這是自動完成的。但要注意的是,框架首先需要知道你的控制。如果你用aspx聲明瞭你的控件,框架將爲你完成這項工作。但是如果您在生命週期中添加控件(又名動態),則還必須在回發中執行此操作。 – karlis 2010-01-19 09:25:05

+0

可以說你在第一個請求(獲取)中添加一個地址控件到你的佔位符。用戶填寫一些字段(街道,城市..)。在回發框架中將postdata分配給控件。如果現在沒有使用第一步中設置的ID進行控制,則會發生異常。如果在處理回發數據之前添加控件,框架可以找到控件並添加數據。 在此之後,你可以在正常方式(數據保存等)處理你的頁面。完成此任務後,您可以更改您的控件,因此可能會刪除地址控件並添加手機連接 – karlis 2010-01-19 09:27:24