2012-01-16 46 views
3

我在同一頁面上有一個Entry Form和一個GridView。從GridView中選擇一行可以在GridView行的所有條目中填充上面的Entry Form中的TextBoxes。限制AJAX調用的視圖狀態信息

當打開此頁面並從GridView中選擇任何行時,我可以看到許多View State數據正在通過每個AJAX請求發送到服務器。我選擇瀏覽器的查看源選項來檢查這一點。我嘗試使用以下方法禁用頁面頂部的View State:EnableViewState =「false」,但我的應用程序停止正常運行。

在從GridView中選擇任何行時,會生成錯誤,因此我重新啓用了視圖狀態。

有沒有優化的方式來使用視圖狀態和保持AJAX請求小?任何與視圖狀態壓縮相關的東西?

我正在使用ASP.NET 2.0。

+1

網格中可用的字段列表以及您希望填充的文本框列表將會非常有用,甚至可能會爲您提供一些代碼。到目前爲止,@KevinM已經發布了最佳答案。作爲恢復的AJAX.NET用戶,我可以證明您想使用.NET來獲得最佳的功能:中間層。然後讓jQuery做前端ajax工作。寫一個aspx頁面非常簡單(如果你不想編寫一個web服務),它可以監聽AJAX請求並用一點可用數據作出響應。祝你好運! – 2012-01-29 17:44:36

回答

4

從你使用UpdatePanel的那一刻起,開箱即用的ajax打電話給你的是發送所有表單發佈數據,包括大視圖狀態。

您有兩種方法,一種是定製,ajax調用,僅針對您控制的更改,而不是UpdatePanel的完整回發。

另一種方法是最小化回傳每個回帖的頁面,壓縮視圖狀態

要壓縮視圖狀態,我建議這裏有一些頁面可以使用源代碼。

http://www.codeproject.com/Articles/14733/ViewState-Compression

http://www.hanselman.com/blog/ZippingCompressingViewStateInASPNET.aspx

http://www.bloggingdeveloper.com/post/How-To-Compress-ViewState-in-ASPNET-20-ViewState-Compression-with-SystemIOCompression.aspx

和我做了一個類似的問題: How to limit the number of post values on UpdatePanel?

0

簡短的回答是否定的。

這裏是從Ajax的視圖狀態的離合器釋放頁面的方式調用

  • 不依賴於網格視圖的行單擊事件。
  • 將鏈接列添加到網格視圖。不要使用服務器點擊事件。
  • 鏈接當用戶點擊鏈接時,通過發送行的ID來發送ajax調用。你將使用jQuery來做一個Ajax的調用。
  • 一旦AJAX調用返回,取記錄的數據,發現表單元素,再次使用jQuery和填充它們
+0

有一個鏈接列(選擇)。當用戶單擊「選擇」時,第一列ID將存儲在會話中,並使用「存儲過程」重新錄製記錄。我想前三點已經被使用了。清除最後一點。 – RKh 2012-01-23 04:20:17

3

第一件事情,如果你使用一個UpdatePanel不。這不是非常有效。實際上,它是完全發佈回來的,這顯然是你想要避免的。

爲什麼不使用GET AJAX請求?這不會將任何內容發佈到服務器上,除了您傳遞的URL(可能包含您需要的行的ID)?

基本上:

創建一個WebService,它將返回您需要的數據。

將一個onclick事件綁定到網格上每一行的Select按鈕。 (可能最容易在綁定事件服務器端完成,使用綁定對象獲取該行的ID)

在事件調用上面創建的webservice(http://api.jquery.com/jQuery.get/ )

在javascript事件的onSuccess方法中根據需要構建條目。

1

正如所有的帖子所述,你可以做一些形式以多種方式壓縮的,你可以實現它自己還是買視圖狀態的壓縮機,但不會幫助你太多。可能有趣的是你應該期待的壓縮量。看看:RadCompression可以獲得一些關於壓縮率的信息,並且對於所有選項(免費/付費)的性能改進通常都是相同的。

我認爲費率不令人滿意,你應該尋找你的問題的設計替代方案。

現在,如果我理解正確,您想在同一頁面上編輯表格中的網格行。從評論中,您使用的是更新面板,通過描述的行爲,您可以在更新面板中使用網格和編輯表單。 如果你的頁面只有網格和編輯表單,把它們放在更新面板中根本沒有任何幫助。

我做了一個測試目的的小例子,我有一個10行的網格5列和5個字段在同一頁上的編輯表單。 我的意見是:

  1. 有沒有風格的網格給我買了1500字符視圖狀態即達2KB。添加樣式可以讓你在viewstate中獲得更多的數據,你可以檢查任何付費的網格控件示例,並查看未壓縮的viewstate的數量會持續數百行。
  2. 網格選擇的項目Postbacking孔頁(無更新面板)製成3KB的請求,並使用包圍所述網格和編輯形式製成3KB的請求,並得到了更新面板得到的6KB
  3. Postbacking的響應aprox 6KB的響應。內容大小几乎沒有變化。

這是因爲使用更新面板基本上意味着你不刷新整個頁面,而只是刷新你的updatepanel + viewstate區域。所以,如果你的所有頁面都被更新面板所包圍,那根本就不會對你有所幫助,而將它稱爲AJAX是不公平的:)。

現在,asp.net web表單有它的優點,但我的觀點是,沒有人喜歡asp.net web表單了,特別是當有asp.net mvc/wcf/jquery時。您的問題證明了asp.net web表單在按照最初預期使用時的侷限性之一。

我對你的問題一般的解決辦法是:只有

  1. 使用HTML數據顯示控件(網格應該是一個jQuery/ExtJS的插件,顯示你從一個WCF支持AJAX的Web服務得到JSON數據)。擺脫asp網格將幫助你將視圖狀態降低到幾乎沒有,並使你的頁面源代碼可讀。
  2. 製作一個WCF Ajax Web服務並在客戶端交換json < - > wcf關係(使用的方法示例是:getgriddata,addnewrow,deleterow,editrow)。使用這些方法意味着您不必完全回發,並且這會使您的頁面更加美觀和更具響應性。此外,我會盡量不要在頁面事件中使用任何代碼。
  3. 使用您喜歡的jQuery或其他JavaScript框架調用您的Web服務;確保你不使用可怕的asp:ScriptManager將幫助你擺脫多次調用/ScriptResource.axd?以及一些奇怪的在源代碼javascript中做一些接線。