none
想請教asp net 控制項連動功能及驗證問題 RRS feed

  • 問題

  • 各位大大好:
            因專案遇到webform中太多控制項,面臨必須拆頁顯示的狀況(原本9個usercontrol共上百個控制項);
    導致兩個問題:
    1.a頁面的a控制項無法控制b頁面的b控制項隱藏起來
    2.無法一次驗證9個頁面上的控制項是否都已填寫

    想很久,也花不少時間找資料,但都沒有找出可行的方案,
    想請教大大能否提供方向或意見讓小妹參考。謝謝大大。

    p.s.1-這支程式被使用者抱怨等待畫面時間太(2-3秒左右),所以需要改寫,
    使用檢測工具發現程式大量使用viewstate(控制項、資料暫存...etc.),原本想壓縮viewsate,
    測試下來速度也沒有比較快,只好拆頁處理。

    p.s.2-原本想自訂類別存取所有控制項及驗證,但還是想多收集資訊看看是否還有其他可行的方案
    2020年1月8日 上午 01:12

解答

  • 整理一下您目前描述的問題先:
    1.
    這支程式被使用者抱怨等待畫面時間太(2-3秒左右),所以需要改寫
    2.
    原本9個usercontrol共上百個控制項

    由於WebForm的體制是透過PostBack將畫面送回,並以ViewState來保留畫面中輸入的資料
    所以
    a.每次送回(PostBack)要送回上百個控制項的內容+ViewState的資料
    b.每次送回後回應(Response)的內容,包含了整個畫面的所有上百控制項+ViewState的資訊

    所以無論是Request(PostBack), Response的資料都會超大超多
    速度與回應當然就會很久(這是WebForm先天體制的狀況)

    如果要針對此畫面,有比較好的運作,可能要捨棄WebForm先天的機制(PostBack),而改以真正Ajax的方式(非UpdatePanel)來對應
    也就是,不使用PostBack

    當然,寫起來會相對辛苦很多(會有大量的Client端Script的撰寫)
    您的系統架構依據是WebForm的專案
    但是這畫面,卻不使用WebForm的PostBack機制,而是這畫面改寫用以Client端技術為主的Ajax開發方式
    (等於是這個畫面,要進行全面的改寫。但是您原本專案中其他的畫面作業方式不變,只改這畫面的撰寫方式)

    這樣的方向,您是否可以接受?

    如果可以,再來細聊作法
    ^.^a

    topcat(姍舞之間的極度凝聚)
    http://www.dotblogs.com.tw/topcat
    世界上有兩樣東西分享給別人後,不但不會變少,還會變更多:
    一個是快樂,另一個是知識~ 分享...是知識累積的開始...

    • 已標示為解答 Tuobaling 2020年1月9日 下午 03:01
    2020年1月9日 上午 03:16
    版主

所有回覆

  • 建議先將Page的EnableViewState屬性設定為False, 降低ViewState的體積, 再修正網頁因EnableViewState屬性未啟用產生的異常, 如果網頁載入速度變快, 就可以不用拆頁了
    2020年1月8日 上午 04:51
  • 大大 您好:

            謝謝您的耐心解答,您說的方式我有試過,發現程式中資料暫存也是用viewstate,

    例如:資料庫查詢的資料;想請教我應該如何調整?目前暫不考慮放seesion及cookie,

    資料等到使用者離開該頁面後即清空,不用留存很久。

    2020年1月9日 上午 01:15
  • 整理一下您目前描述的問題先:
    1.
    這支程式被使用者抱怨等待畫面時間太(2-3秒左右),所以需要改寫
    2.
    原本9個usercontrol共上百個控制項

    由於WebForm的體制是透過PostBack將畫面送回,並以ViewState來保留畫面中輸入的資料
    所以
    a.每次送回(PostBack)要送回上百個控制項的內容+ViewState的資料
    b.每次送回後回應(Response)的內容,包含了整個畫面的所有上百控制項+ViewState的資訊

    所以無論是Request(PostBack), Response的資料都會超大超多
    速度與回應當然就會很久(這是WebForm先天體制的狀況)

    如果要針對此畫面,有比較好的運作,可能要捨棄WebForm先天的機制(PostBack),而改以真正Ajax的方式(非UpdatePanel)來對應
    也就是,不使用PostBack

    當然,寫起來會相對辛苦很多(會有大量的Client端Script的撰寫)
    您的系統架構依據是WebForm的專案
    但是這畫面,卻不使用WebForm的PostBack機制,而是這畫面改寫用以Client端技術為主的Ajax開發方式
    (等於是這個畫面,要進行全面的改寫。但是您原本專案中其他的畫面作業方式不變,只改這畫面的撰寫方式)

    這樣的方向,您是否可以接受?

    如果可以,再來細聊作法
    ^.^a

    topcat(姍舞之間的極度凝聚)
    http://www.dotblogs.com.tw/topcat
    世界上有兩樣東西分享給別人後,不但不會變少,還會變更多:
    一個是快樂,另一個是知識~ 分享...是知識累積的開始...

    • 已標示為解答 Tuobaling 2020年1月9日 下午 03:01
    2020年1月9日 上午 03:16
    版主
  • 有一種選擇是存放在資料庫的temp table
    2020年1月9日 上午 04:29
  • topcat大大您好:

             我剛剛才發現您在這裡也有回答,不好意思><,

    我會朝您提供的建議去做改善,謝謝您的幫忙及熱心。


    2020年1月9日 上午 07:33
  • 大大 您好:

          謝謝您的建議,您提供了我沒想到的方向。

    只是有個疑惑想請教:

    假設需要暫存多張資料表的內容,使用此方式會不會造成什麼影響?

    因為需要改寫的這支程式比較麻煩的地方在於要呈現的欄位太多(所有欄位加起來上百個),

    且不是同張資料表,不曉得能不能這樣子處理?


    • 已編輯 Tuobaling 2020年1月9日 上午 07:46
    2020年1月9日 上午 07:45
  • 多資料表,可以是一次一起送入相關資料
    可以一次組多個Update或Insert
    中間加上;區隔即可

    但要特別提醒您
    多資料表維護,務必加上【Transaction】的保護
    來確保【全有全無】的維護過程
    也就是中間萬一有狀況,可以把維護的部分Rollback

    ^_^


    topcat(姍舞之間的極度凝聚)
    http://www.dotblogs.com.tw/topcat
    世界上有兩樣東西分享給別人後,不但不會變少,還會變更多:
    一個是快樂,另一個是知識~ 分享...是知識累積的開始...

    2020年1月9日 下午 02:21
    版主
  • topcat大大您好:

            謝謝您的提醒~

    2020年1月9日 下午 02:58