2008-09-25 95 views
4

我正在從傳統的ASP轉移到ASP.NET,並且遇到了許多您已知的「viewstate」。我可能會用我的假設來跳槍,但看起來非常麻煩。過去我開發了許多ASP表單,從來沒有保持狀態的問題。有沒有另外一種方法,或者我將不得不在ASP.NET中學習這種Viewstate的東西?我使用Visual Studio 2008,VB.NET作爲語言和SQL Server 2005的Framework v3.5的代碼。我是否必須在ASP.NET中使用Viewstate

+0

MVC框架看起來很有趣!謝謝Biri! – Taptronic 2008-09-25 13:35:21

回答

6

你不需要。檢出MVC framework。它消除了ViewState並作爲舊的ASP(至少從這個角度來看)。

+0

謝謝。我要檢查這個MVC的東西了。 – Taptronic 2008-09-25 13:30:50

3

在傳統的ASP中,我們總是使用HIDDEN字段來完成這項工作。 Viewstate只是自動爲你做這件事的一種方式。相信我,學習曲線並不像你想象的那麼高。

+0

這聽起來很舒服(re:學習曲線)。 :-) – Taptronic 2008-09-25 13:25:35

+0

我做了很多經典的ASP,當我第一次轉移到ASP.Net時,它讓我大惑不解。然而,一旦你習慣了模型,與舊的做事方式相比,這是相當不錯的。如果我再也不需要再看另一個ADO記錄集,我會很開心:) – Josh 2008-09-25 13:26:54

+0

我目前處於「將我的頭腦分開」模式。 :-)像其他所有事情一樣,總有一天它會發生。 – Taptronic 2008-09-25 13:30:10

2

ViewState在幾乎所有情況下都是可選的,如果不是全部情況。即使ViewStateEnabled = false,ASP.NET也會自動重新填充字段。我一直使用ASP.NET 5或6年,並且從來不必依賴於ViewState。我什至可以禁用它。

+0

我將不得不對此進行試驗。感謝您的答覆。 – Taptronic 2008-09-25 13:26:47

+0

瞭解ViewState和ControlState之間的區別 – 2008-09-25 18:37:05

1

Viewstate自動保存爲「rooted」到頁面的asp.net控件。你不需要做的事情,值和其他一些信息被傳遞到一個隱藏的輸入B64編碼。如果你願意,你可以看看它,但沒關係,它都是爲你自動處理的。

+0

我已經開始看這個編碼,並且認爲「男人!是這樣的?!」並閱讀它,但確實看到或知道是否有其他選擇。 Bri說要研究MVC框架,我可能會這樣做。謝謝! – Taptronic 2008-09-25 13:28:36

3

當您關閉ViewState時,一些控件會嚴重癱瘓,因此請準備好解決這些問題。最簡單的做法就是懶惰並保持開啓狀態,但不加限制,ViewState可以輕鬆佔據HTML大小的30%。

例如,假設您有DropDown,並將其綁定到水果列表。您將其綁定在頁面加載中的if(!IsPostBack){}塊中。如果您關閉ViewState,當您單擊按鈕時將丟失項目。他們需要綁定每一頁的負載。你也將失去你選擇的索引,所以你需要從Request.Form []變量中取消。

3

當您使用ASP.NET時,Viewstate是包中的一部分。對於基本頁面/網站,您不必「知道」如何使用Viewstate。它只是在您將控件放在頁面上時使用。

很難避免Viewstate與ASP.NET,因爲即使您在項目級別關閉它,某些單獨的控件仍然使用Viewstate來保存其信息。

如果您不想處理Viewstate,請考慮使用ASP.NET MVC框架。你可能會更習慣於來自Classic ASP的MVC框架。

2

ViewState大部分都是自動運行的。這就是ASP.NET如何跟蹤所有控件的當前狀態。

如果你想存儲一些額外的數據,你也可以手動使用viewstate。這很簡單,只要:

Viewstate["Key"] = value; 

與唯一需要注意的是,你在ViewState中存儲的任何對象必須是可序列化。

1

如果你正在爲自己的消費編寫代碼,你可以關掉它而不用擔心。

大概你會保留其他人編寫的Web窗體代碼,所以你應該知道配置選項和痛點是什麼。前幾年,我能想到的

  • 如何在網站,網頁和控制水平禁用
  • 爲什麼的machineKey是在Web場相關
  • 爲什麼你的事件日誌已滿ViewStateAuthentication錯誤
  • 什麼ViewStateUserKey的是

就實際的學習曲線而言,這可能是對幾篇MSDN文章的徹底閱讀。

1

ViewState是Web形式隱喻固有的必要的邪惡。我個人認爲這種方法已經過時,臃腫,一般不友好。按照上面的建議更好地檢查MVC框架。

我建議你避免使用ViewState作爲「緩存」來回傳遞數據(我見過網站這樣做是因爲集羣設置和沒有SQL支持的會話狀態)的誘惑。數據將被序列化並添加到頁面中,並且必須完成每次請求的往返操作,從而增加頁面的總大小並使您的站點加載速度更慢。

2

我絕對可以推薦避免DataGrids和DropDownLists中的ViewState,因爲我最近剛開始自己​​做。我沒有爲了好玩而這樣做,我不得不修復一個頁面,這個頁面變得如此之大以至於導致了其他問題。但事實證明這很容易,結果如此戲劇化以至於我很高興。當然,對於一個簡單的小應用程序或少量數據來說,這不是必需的,但另一方面,它是很好的保持一致(始終從已知到已知,以便您可以不斷改進過程...),以及爲什麼攜帶額外的行李,永遠?

這將需要您的一部分人工干預。例如,如果關閉下拉列表的viewstate,則需要在每次回發時重新綁定它們,然後從Request對象中恢復SelectedValue。你需要閱讀這個,但谷歌有很多現成的信息。

5

ViewState是可選的,但有幫助。什麼是ViewState,是SERVER SIDE控件上發生的所有變化。因此,如果您將文本分配給標籤,並且希望該文本在每次回發時都不需要重新分配,那麼您就需要保留該文本。另一個我總是離開ViewState的例子是任何數據綁定。

也就是說,有時候出於同樣的原因關閉ViewState是有幫助的。例如,一個地方我總是關閉ViewState是一個MESSAGE標籤。這樣,當我不得不向用戶打印一條消息時(只應該出現一次然後消失),我只是將文本添加到標籤中,然後將它忘掉。在下一次回發期間,標籤將自動恢復爲在該控件的ASPX聲明中找到的文本(在本例中爲空字符串)。

現在請注意,這與表單集合無關,這是在PostBack期間發佈到IIS的值。表單集合將用戶輸入的值發送到表單元素(文本框,複選框,下拉列表等)。這些.NET將填充到適當的位置 - 這發生在之後 ViewState已被處理。

這樣,如果您向客戶端發送帶有短語「hi there」的文本框,則用戶將其更改爲「See ya」,然後提交表單,在Page_Load事件觸發時文本框將具有什麼內容是TEXT屬性中帶有「See ya」的文本框。

0
'<%@ Control Language="C#" AutoEventWireup="true" CodeFile="HomePage.ascx.cs" Inherits="HomePage" %> 
<script runat="server"> 
    void testHF_ValueChanged(object sender, EventArgs e) 
    { 
     this.HFvalue.Text = this.testHF.Value ; 

    } 
</script> 
<asp:Label ID="UserNamelbl" runat="server" Text="User Name : " Visible="false"></asp:Label> 
<asp:TextBox ID="UserNametxt" runat="server" Visible="false" ></asp:TextBox> 
<asp:Label ID="HFvalue" Text="......" runat="server"></asp:Label> 
<asp:HiddenField ID="testHF" 
OnValueChanged="testHF_ValueChanged" 
value="" 
runat="server" ></asp:HiddenField> 
<input type="submit" name="SubmitButton" value="Submit" onclick="CL()" /> 

<script type="text/javascript"> 
    function CL() 
    { 
     this.testHF.Value = this.UserNametxt.Text; 
    } 
</script> 
' 
相關問題