2011-05-19 59 views
4

ASP.net webforms的主要問題之一是viewstate機制,它需要大量的帶寬,因爲他將所有的表單輸入序列化並在post命令上發送。Asp.net MVC真的消除了viewstate嗎?

在我讀的這本書中,提到MVC的一個主要優點之一就是mvc不包含viewstate。這聽起來很酷,但從我看到的情況來看,mvc還會將所有輸入發送到post命令(這是他可以使用綁定機制的唯一方法)。

所以有什麼區別?你可以調用它的視圖狀態,你可以稱它爲「綁定」,但底線MVC和webforms序列化所有的輸入,併發送所有的POST。

我錯了嗎?如果不是,有什麼區別?

+3

對於每個請求發送ViewState並不是必需的。如果帶寬有問題,您可以修改Page Persister以存儲ViewState。我認爲ViewState的一個更大的問題是它給了開發人員不正確的想法,他們正在一個固有的無狀態環境中編寫一個有狀態的應用程序。 – Xhalent 2011-05-19 21:49:25

回答

4

差別很大。 Viewstate可能會變得很大。它保留了不一定包含在表單數據中的值。想想GridViews和Label等。它們不在輸入字段中,但它們通過ViewState持續存在。在MVC中確實沒有持久性的概念。這取決於你將數據返回到視圖(儘管綁定機制使得這很容易做到)

+0

你可以在你不需要的控件中禁用viewstate,它不會序列化這麼多的數據,實際上你可以禁用整個頁面的viewstate。並且僅在需要它的控件(如文本框)中啓用它。 – 2011-10-08 20:08:18

2

ViewState不同於一般形式POST。當你開機自檢時,你顯然必須包括所有的輸入,否則服務器無法處理數據。

ViewState存儲有關控件的其他屬性,例如顏色,數據綁定,文本值等。這些值被髮送到瀏覽器並再次返回,以便維護頁面上每個控件的狀態,但它們不是部分「數據」在發佈時由服務器處理。

+0

如果我有一個按鈕和一個標籤,當按下按鈕時,我將標籤值設置爲「lala」。現在表單確實提交。當頁面返回時,mvc將如何記住標籤的值爲「lala」?以及如何使用MVC解決它? – 2013-04-30 16:22:52

1

您究竟打算如何處理任何類型的表單數據而不將值傳遞迴服務器?這是一個愚蠢的說法。是的,發佈確實將表單值傳遞給服務器,因爲這是服務器處理它們的唯一方式。

Viewstate是一個字典,其中包含頁面上每個控件的狀態數據,該數據通過發佈數據傳遞。 MVC沒有視圖狀態,所以當發佈帖子時,只有表單數據的當前內容。沒有頁面狀態,只有會話狀態(存儲在服務器上)。

這是完全不同的事情。

+0

這指出它相當不錯! – Marcel 2013-03-14 12:55:20

+0

如果我有一個按鈕和一個標籤,當按下按鈕時,我將標籤值設置爲「lala」。現在表單確實提交。當頁面返回時,mvc將如何記住標籤的值爲「lala」?以及如何使用MVC解決它? – 2013-04-30 17:31:13

+0

@RoyiNamir - 有很多方法可以解決這個問題,你將如何做到這一點取決於你的應用程序。提供適當的解決方案的變量太多了。 – 2013-04-30 18:21:45

1

我不會回收別人說過的話,但我會補充一點,WebForms是一個使用僞狀態範式的框架。就像具有狀態的桌面應用程序一樣,WebForms就是將某些狀態帶入繼承無狀態Web的好例子。它實現這一目的的主要機制是ViewState。 ViewState不僅僅是當前控件的序列化內容,還可以用於序列化和維護模型的狀態。這就是WebForms的狀態。

另一方面,MVC返回到更傳統的無狀態框架的傳統,因此不需要ViewState。我不同意模型綁定與ViewState相同,因爲模型綁定不尊重任何以前的狀態(除非手動從會話/應用程序緩存等手動恢復模型的狀態),模型在僅限於請求的生命週期。而在WebForms模型中,可以將模型序列化以提供應用程序狀態。

0

在我看來MVC好好嘗試一下消除它。仍然需要在嚮導頁面中保留來自其他帖子的數據。 Here is link how to do it in a view state way!當然,有人可能會爭辯說,您可以在隱藏字段中手動保存這些數據,但它需要很多工作,並且不會阻止數據篡改。