我正在從傳統的ASP轉移到ASP.NET,並且遇到了許多您已知的「viewstate」。我可能會用我的假設來跳槍,但看起來非常麻煩。過去我開發了許多ASP表單,從來沒有保持狀態的問題。有沒有另外一種方法,或者我將不得不在ASP.NET中學習這種Viewstate的東西?我使用Visual Studio 2008,VB.NET作爲語言和SQL Server 2005的Framework v3.5的代碼。我是否必須在ASP.NET中使用Viewstate
回答
你不需要。檢出MVC framework。它消除了ViewState並作爲舊的ASP(至少從這個角度來看)。
謝謝。我要檢查這個MVC的東西了。 – Taptronic 2008-09-25 13:30:50
在傳統的ASP中,我們總是使用HIDDEN字段來完成這項工作。 Viewstate只是自動爲你做這件事的一種方式。相信我,學習曲線並不像你想象的那麼高。
ViewState在幾乎所有情況下都是可選的,如果不是全部情況。即使ViewStateEnabled = false,ASP.NET也會自動重新填充字段。我一直使用ASP.NET 5或6年,並且從來不必依賴於ViewState。我什至可以禁用它。
我將不得不對此進行試驗。感謝您的答覆。 – Taptronic 2008-09-25 13:26:47
瞭解ViewState和ControlState之間的區別 – 2008-09-25 18:37:05
Viewstate自動保存爲「rooted」到頁面的asp.net控件。你不需要做的事情,值和其他一些信息被傳遞到一個隱藏的輸入B64編碼。如果你願意,你可以看看它,但沒關係,它都是爲你自動處理的。
我已經開始看這個編碼,並且認爲「男人!是這樣的?!」並閱讀它,但確實看到或知道是否有其他選擇。 Bri說要研究MVC框架,我可能會這樣做。謝謝! – Taptronic 2008-09-25 13:28:36
當您關閉ViewState時,一些控件會嚴重癱瘓,因此請準備好解決這些問題。最簡單的做法就是懶惰並保持開啓狀態,但不加限制,ViewState可以輕鬆佔據HTML大小的30%。
例如,假設您有DropDown,並將其綁定到水果列表。您將其綁定在頁面加載中的if(!IsPostBack){}塊中。如果您關閉ViewState,當您單擊按鈕時將丟失項目。他們需要綁定每一頁的負載。你也將失去你選擇的索引,所以你需要從Request.Form []變量中取消。
當您使用ASP.NET時,Viewstate是包中的一部分。對於基本頁面/網站,您不必「知道」如何使用Viewstate。它只是在您將控件放在頁面上時使用。
很難避免Viewstate與ASP.NET,因爲即使您在項目級別關閉它,某些單獨的控件仍然使用Viewstate來保存其信息。
如果您不想處理Viewstate,請考慮使用ASP.NET MVC框架。你可能會更習慣於來自Classic ASP的MVC框架。
ViewState大部分都是自動運行的。這就是ASP.NET如何跟蹤所有控件的當前狀態。
如果你想存儲一些額外的數據,你也可以手動使用viewstate。這很簡單,只要:
Viewstate["Key"] = value;
與唯一需要注意的是,你在ViewState中存儲的任何對象必須是可序列化。
如果你正在爲自己的消費編寫代碼,你可以關掉它而不用擔心。
大概你會保留其他人編寫的Web窗體代碼,所以你應該知道配置選項和痛點是什麼。前幾年,我能想到的
- 如何在網站,網頁和控制水平禁用
- 爲什麼的machineKey是在Web場相關
- 爲什麼你的事件日誌已滿ViewStateAuthentication錯誤
- 什麼ViewStateUserKey的是
就實際的學習曲線而言,這可能是對幾篇MSDN文章的徹底閱讀。
ViewState是Web形式隱喻固有的必要的邪惡。我個人認爲這種方法已經過時,臃腫,一般不友好。按照上面的建議更好地檢查MVC框架。
我建議你避免使用ViewState作爲「緩存」來回傳遞數據(我見過網站這樣做是因爲集羣設置和沒有SQL支持的會話狀態)的誘惑。數據將被序列化並添加到頁面中,並且必須完成每次請求的往返操作,從而增加頁面的總大小並使您的站點加載速度更慢。
我絕對可以推薦避免DataGrids和DropDownLists中的ViewState,因爲我最近剛開始自己做。我沒有爲了好玩而這樣做,我不得不修復一個頁面,這個頁面變得如此之大以至於導致了其他問題。但事實證明這很容易,結果如此戲劇化以至於我很高興。當然,對於一個簡單的小應用程序或少量數據來說,這不是必需的,但另一方面,它是很好的保持一致(始終從已知到已知,以便您可以不斷改進過程...),以及爲什麼攜帶額外的行李,永遠?
這將需要您的一部分人工干預。例如,如果關閉下拉列表的viewstate,則需要在每次回發時重新綁定它們,然後從Request對象中恢復SelectedValue。你需要閱讀這個,但谷歌有很多現成的信息。
ViewState是可選的,但有幫助。什麼是ViewState,是SERVER SIDE控件上發生的所有變化。因此,如果您將文本分配給標籤,並且希望該文本在每次回發時都不需要重新分配,那麼您就需要保留該文本。另一個我總是離開ViewState的例子是任何數據綁定。
也就是說,有時候出於同樣的原因關閉ViewState是有幫助的。例如,一個地方我總是關閉ViewState是一個MESSAGE標籤。這樣,當我不得不向用戶打印一條消息時(只應該出現一次然後消失),我只是將文本添加到標籤中,然後將它忘掉。在下一次回發期間,標籤將自動恢復爲在該控件的ASPX聲明中找到的文本(在本例中爲空字符串)。
現在請注意,這與表單集合無關,這是在PostBack期間發佈到IIS的值。表單集合將用戶輸入的值發送到表單元素(文本框,複選框,下拉列表等)。這些.NET將填充到適當的位置 - 這發生在之後 ViewState已被處理。
這樣,如果您向客戶端發送帶有短語「hi there」的文本框,則用戶將其更改爲「See ya」,然後提交表單,在Page_Load事件觸發時文本框將具有什麼內容是TEXT屬性中帶有「See ya」的文本框。
This series of posts is must reading for understanding ViewState
我禁用它,做我的大部分工作在Page_Init而不是負載(值仍然保持,因爲了ControlState-的)。這個設置對我來說非常有效。
'<%@ 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>
'
- 1. 我是否必須使用onPause/onStart/onDestroy
- 2. 我是否必須使用UNION insted JOIN?
- 3. 是否必須使用SSL?
- 4. asp.net GridView是否有能力使用ViewState?
- 5. 我是否必須在C++中使用引用?
- 6. 我是否必須在每個類中使用「包」術語
- 7. 如果我使用EntityFramework,是否必須在ViewModel中引發PropertyChanged?
- 8. 我們在使用會話時是否必須使用mysql_real_escape_string()?
- 9. 當「必須」我使用asp.net CreateChildControls()?
- 10. 我是否必須預編譯asp.net mvc應用程序?
- 11. 我在使用AdMob時是否必須擁有IDFA?
- 12. 我是否必須使用「ASP.net配置」工具來管理用戶?
- 13. 是否必須使用「remember_token」字段?
- 14. 是否必須使用flags屬性?
- 15. 分配時是否必須使用initWithString?
- 16. Bootstrap Carousel是否必須使用圖像?
- 17. Mercurial Server是否必須使用Mercurial?
- 18. 我是否必須使用Compass使用Django-Grappelli修改CSS?
- 19. 在TClientDataSet中使用Locate時,是否必須使用Disable/EnableControls?
- 20. 是否必須在證書中使用keyusage?如果使用jdk7
- 21. 我是否必須使用_ID作爲SQlite主鍵?它是否必須是一個INT? (Android Dev)
- 22. ASP.NET MVC中ViewState是否相關?
- 23. 我是否必須處理我不使用的返回對象?
- 24. 我是否必須在動作循環中使用「xxforms:evaluate」來使用迭代器?
- 25. 我們是否必須在SpringBoot中使用JPA時使用Left Join查詢?
- 26. 我是否必須在NSManagedObject didTurnIntoFault中調用super?
- 27. 是否必須在我的應用程序中進行配置?
- 28. 我是否必須配置SQLiteCommand對象?
- 29. 我們是否必須刪除QUpdSockets?
- 30. 我是否必須一直指定System.Web.HttpContext.Current.Server?
MVC框架看起來很有趣!謝謝Biri! – Taptronic 2008-09-25 13:35:21