2016-04-15 63 views
1

我寫了一些網頁,使用需要ViewState值的常用例程。如何從共享類中訪問ViewState?

ViewState可以傳入函數嗎?

如果是這樣,怎麼樣?

如果不是,我怎麼能從類中的方法訪問它們?

+0

在調用它們之前,您可以傳遞'Page'實例或可能更好,只是您已從'ViewState'中提取的相關值。 –

回答

0

這是關鍵語句:

所需的ViewState值

但功能並不真正需要「的ViewState」值的函數, - 他們只需要值。如果一個函數在stringint上運行,那麼最好用這種方式編寫函數,這樣可以更容易進行單元測試。

如果它是一個數字,你要讀和/或操縱,那麼你可以創建一個這樣的一類非常特殊的值:

public class MyPageValues 
{ 
    public string Value1 {get;set;} 
    public string Value2 {get;set;} 
} 

,然後補充說,從裝載值構造函數或擴展方法ViewState

public class MyPageValues 
{ 
    public string Value1 {get;set;} 
    public string Value2 {get;set;} 

    public MyPageValues(){} //default constructor 
    public MyPageValues(System.Web.UI.StateBag viewState) 
    { 
     Value1 = (string)viewState["Value1"]; 
     Value2 = integer.Parse(viewState["Value2"]); //Do some better checking. 
    } 
} 

更好的是,只需將整個類序列化到viewstate並從那裏檢索它。

[Serializable()] 
public class MyValues 
{ 
    public string Value1 {get;set;} 
    public string Value2 {get;set;} 
} 

public partial class YourPage: System.Web.UI.Page 
{ 
    private MyValues _values; 

    protected void Page_Load(object source, EventArgs e) 
    { 
     _values = ViewState["myValues"] as MyValues ?? new MyValues(); 
    } 

    protected void Page_PreRender(object sender, EventArgs e) 
    { 
     ViewState["myValues"] = _values; 
    } 
} 

這樣,你可以提取ViewStatePage_Load類(或者,如果需要創建一個新的實例),閱讀它,處理它,把它傳遞給其他函數,然後當你做你剛纔保存整個事情完好無損地回到ViewState