2009-01-15 86 views
4

我已經在ASP.net中編寫了一個應用程序,該應用程序旨在讓用戶將記錄添加到數據庫中。該頁面設置爲當用戶添加記錄時,新添加的記錄的ID號在session中設置,頁面Response.Redirects爲「Thank you for submitting」頁面,然後重定向回原始頁面以允許進一步編輯。用戶還可以使用此屏幕上的「後退」按鈕返回到原始記錄添加頁面,以便他們對數據進行編輯。在ASP.NET中如何處理會話和多個選項卡?

但是,我發現在會話中存儲ID並不是一個非常好的解決方案,因爲用戶可能會嘗試在不同的選項卡或窗口中創建兩個文檔。我也嘗試在文字控件中設置ID,但這會導致問題,即當用戶使用「後退」按鈕時,文字控件未設置爲ID,並且會添加新記錄而不是正在編輯的記錄。

有沒有這方面的解決方案?

回答

1

愚蠢的問題,用戶爲什麼使用後退按鈕,編輯只是在後接受的數據?

如果編輯以前發佈的數據是一個常見的場景,爲什麼不只是重定向到一個頁面,當數據被接受,讓他們對其進行編輯。然後,如果點擊後退按鈕,他們將回到原來的「乾淨」插入/添加新的數據頁面。

這會給出以下流程 Add - > [Post] - > Edit - > ..... Add - > [Post] - > Edit - > [Back button] - > Add - > [Post ] - >編輯 - > [發佈] - >編輯....

0

控件將其狀態保存在ViewState中。如果您選擇使用SessionState而不是ViewState來存儲信息,則控件會將其狀態保存在會話狀態中,並且在多個選項卡中它將無法正常工作。

我還沒有找到一種方法來繞過此問題,同時仍然使用SessionState。我們的解決方案是使用普通的ViewState。

5

我建議將您的ID存儲在QueryString中。添加記錄後,重定向到您的「謝謝」頁面,然後我猜測包含編輯表單的鏈接,您將使用查詢字符串中的ID生成該編輯表單。遵循該鏈接時,編輯頁面會將ID從查詢字符串中拉出以便加載正確的記錄進行編輯。

您的添加和編輯表單甚至可以是相同的頁面,當在查詢字符串中提供了一個ID時,表單知道編輯該記錄,否則您的表單會添加一條新記錄。

+1

人,你以10秒打我吧.... – 2009-01-15 17:37:06

+0

對此感到遺憾;) – Trent 2009-01-15 17:39:44

1

您是否嘗試過在querystring中添加ID?然後,您可以閱讀它,並根據需要將其添加到會話中(例如,用戶單擊後退按鈕)。

看起來像許多問題,允許在使用後退按鈕時呈現的頁面中編輯對象。改爲給他們一個編輯按鈕是否太多了?

0

我試過將查詢字符串存儲在查詢字符串中(這對編輯來說基本沒問題),但問題在於當信息存儲在會話中時,他們使用「後退」按鈕。如果用戶將執行以下操作:

  1. 用戶創建一個記錄(第一記錄),該ID是沿着查詢字符串傳遞,並臨時存儲在會話中。
  2. 用戶創建另一條記錄(第2條記錄),該ID在查詢字符串中傳遞,臨時存儲在會話中。
  3. 用戶使用第一條記錄上的後退按鈕轉到沒有查詢字符串的頁面。

這可能是一個牽強的場景,但它可能會發生。我唯一的解決方案是通過在JavaScript中使用window.history.forward()來阻止Back按鈕的使用返回到添加頁面。但這是一個解決方案是可怕的。

0

我的問題是你爲什麼要在會話中存儲任何東西以開始?如果您可以避免在會話中存儲任何內容,我認爲您完全可以更好。

0

已經想過這個,做以下聽起來像一個體面的解決方案,我上面列出的問題?

  • 首次添加記錄時,存儲添加頁面在隱藏字段中訪問時間的時間戳。
  • 當用戶單擊保存時,此時間戳會通過會話。隨身份證。
  • 如果用戶同時打開另一個選項卡並保存,則新頁面的時間戳會通過會話。
  • 如果用戶試圖訪問第一個記錄(使用後退按鈕)的添加頁面時,系統查找會議,並認爲如果有一個時間戳,以及它是否符合一個在該頁面的隱藏字段。
  • 如果不匹配,那麼用戶會得到提示,並被告知要正確編輯記錄。

這聽起來是合理的,否則太過於複雜?