2013-08-24 52 views
1

好吧,以這種方式實現單頁應用程序是不好的做法嗎?

所以我創建了這個web應用程序,它被設計成一個單頁面應用程序。有一個菜單只是在單個更新面板中加載各種用戶控件(設計爲表單)之一(清除控件,加載新控件等)。用戶做什麼都輸入,點擊保存,刪除等。在這些用戶控件中,有幾個數據綁定和內部依賴控件,這是我將它們加載到更新面板中的主要原因。現在

,我有過這樣的問題,即當用戶選擇一個新的菜單,然後進入更改數據綁定控件的值,控制損失僅在第一回發它的價值。我很確定這是由於清除了usercontrol所在的容器,因爲我已經嘗試清除並加載常規面板,而且我會遇到完全相同的問題。由於使用(!IsPostBack)在我的情況下不起作用,我剛剛創建了一個布爾會話變量來執行頁面和usercontrol之間的相同邏輯,就數據綁定而言。爲了進一步測試我的問題,我將應用程序更改爲多頁應用程序,問題消失;值在回發時保留。

所以,去我原來的觀點,我在使用mulitples頁中看到的功能;我認爲在單頁面版本中,如果我只是在代碼中添加了'Server.Transfer(thefaultfault.aspx)',我將保留從多頁面方法中獲得的功能,同時保持用戶在同一頁面上。它效果很好。沒有數據丟失,它的工作原理應該如此。這是不好的味道?所有的用戶功能和職責總是在一個頁面上執行,導航對他們沒有任何幫助。

我只是擔心基本上刷新頁面只是不好的做法或哈克,但它適用於應用程序的目的,以及節省不必要時創建2-3打打印頁面。我已經閱讀了一些線程,其中有人會這樣做只是爲了清除結果,或者是一些小問題,但僅此而已。

如果是差的做法(或者即使它不是),便叫人有一個解決方案,在第一時間回傳值的損失?我在master,page,usercontrol和子控件上啓用了enableviewstate = true和viewstatemode =啓用了數據綁定。預先感謝您的任何意見。

回答

0

這種做法會導致很多在未來的問題。我不會做這樣的

0

所以,在活動的任何人遇到同樣的問題,是不合法的解決辦法,我跟一個其他的日子「來到了」我回來的時候,以解決這一問題。

第一回發問題似乎從容器控制(佔位符,面板的UpdatePanel等)的清除和再增殖幹。因爲我有用戶點擊菜單項,然後將清除並加載到容器usercontrols,回發引用usercontrol不同於新加載。忍受我如何嘗試描述情況...

上次加載的用戶控件是在菜單點擊事件觸發前引用初始菜單,然後清除容器並加載新的用戶控件從菜單點擊事件。當容器中沒有加載控件時(初始啓動),這不會發生。由於usercontrols是動態添加的,我有一個重載當前加載的usercontrol的方法,它被放置在Page_Init中。此事件與PreInit一起,_Load,在控制事件之前都發生火災,並且是我的問題的原因。這個問題的解決方法就像在更多的經驗中顯而易見的那樣,是將if語句添加到用戶控件加載方法和Page_Init(或者具有加載方法的任何地方),以確定導致回發的原因。因爲我只想讓用戶點擊菜單項在衆多任務中移動,我只是確保如果菜單項單擊導致回發,那麼不要在Init中運行load方法,但是,其他任何導致回發(對我來說,只在用戶控件內),Init中的加載方法只會觸發。

此外,if語句在load方法中是必需的,以確保新添加的usercontrols中的所有控件都包含默認值/空值,基本上您希望用戶首次顯示控件時看到的默認值我的情況我有:

if (Page.Request.Params["_EVENTTARGET"].Contains("Menu1") == true) 
{ 
uc.Clear(null, null); 
uc.SetBoundControls(); 
} 

希望這可以幫助其他人,或者對火花更好的解決方案思想。

0

是的,這是不好的做法。隨着UI複雜性的增加,WebForms的狀態問題會逐漸惡化。

我堅持SPA UI狀態與一個單一的類,它被序列化爲XML並以純文本形式保存到數據庫。我在URL中使用一個GUID作爲會話密鑰(但可以有一個用戶標識或ASP.NET會話標識或其他)來檢索每個請求的狀態信息,從而消除了在管理狀態或丟失數據時出現的任何問題用戶刷新頁面。

這樣做還有一個額外的好處,即允許您使用單元測試覆蓋邏輯UI,而不會糾纏在Web層細節中 - 這對於複雜的工作流程非常有用。

但是,如果您嘗試此操作,我會建議您考慮轉移到MVC並使用普通的舊Post-and-Redirect;當您想要允許後退按鈕時,將哈希標記添加到重定向響應。

相關問題