2014-02-24 39 views
1

我使用viewstate相當多的存儲一些標誌和小數據,需要在回發中保留。 大多數時候,我用它像這樣每個變量的ViewState對一個變量

public partial class testPage : System.Web.UI.Page 
{ 
    public string item1 { get { return (string)(ViewState["item1"] ?? default(string)); } set { ViewState["item1"] = value; } } 
    public string item2 { get { return (string)(ViewState["item2"] ?? default(string)); } set { ViewState["item2"] = value; } } 
    public string item3 { get { return (string)(ViewState["item3"] ?? default(string)); } set { ViewState["item3"] = value; } } 
    public bool flag1 { get { return (bool)(ViewState["flag1"] ?? default(bool)); } set { ViewState["flag1"] = value; } } 
    public bool flag2 { get { return (bool)(ViewState["flag2"] ?? default(bool)); } set { ViewState["flag2"] = value; } } 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     // flag1... 
    } 
} 

這是好的,但看起來有點沉重,我不知道該desirialization進程是否只發生一次或每一次我訪問變量。 所以我想可能是這種技術在性能和管理

public partial class testPage : System.Web.UI.Page 
{ 
    public PageVeriables Variables { get { return (PageVeriables)(ViewState["Variables"] ?? default(PageVeriables)); } set { ViewState["Variables"] = value; } }  

    protected void Page_Load(object sender, EventArgs e) 
    { 
     //Variables.flag1.. 
    } 
} 

[Serializable] 
public class PageVeriables 
{ 
    public string item1 { get; set; } 
    public string item2 { get; set; } 
    public string item3 { get; set; } 
    public bool flag1 { get; set; } 
    public bool flag2 { get; set; } 
} 

問題來講是一個好一點是沒有人真正擁有比其他任何好處?

+2

一些想法:序列化和反序列化每個請求發生一次。使用單個對象需要更少的樣板代碼(如您所見)。如果只有很少的變量被設置爲很多,那麼對每個變量使用單獨的ViewState項目可能會導致比單個對象更短的序列化__VIEWSTATE。 –

回答

1

我會推薦做第一個例子,儘管它可能是更多的輸入。

它有兩個明顯的優勢:

第一個是邁克爾·劉說,這是ViewState的大小是有更多的粒度。如果您只使用10個屬性中的2個,則您的ViewState大小隻佔您實際分配給的2個。

第二個我覺得更重要的是,它遵循相同的UserControls模式,因爲它們具有您分配給的屬性。例如,給定一個Text屬性用戶控件,使用在ASPX用戶控制將如下所示:

<demo:MyUserControl Text="Some Text" runat="server" /> 

這也將在設計工作。所以對於遵循約定有些事要說,(大部分)屬性會在後備之間持續存在。